You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2006/07/28 23:57:06 UTC

svn commit: r426676 - in /incubator/stdcxx/trunk/util: cmdopt.cpp cmdopt.h exec.cpp exec.h output.cpp output.h runall.cpp util.cpp util.h

Author: sebor
Date: Fri Jul 28 14:57:05 2006
New Revision: 426676

URL: http://svn.apache.org/viewvc?rev=426676&view=rev
Log:
2006-07-28 Andrew Black <ab...@roguewave.com>

	* cmdopt.h (target_name): Declared global variable indicating current
	target.
	* cmdopt.cpp (eval_options): Routed unknown option message to stderr
	rather than stdout.
	* cmdopt.cpp (split_child_opts): Cached output of a strlen() call.
	* util.h (warn): Declared.
	* util.cpp (warn): Added utility function for generating a (non-fatal)
	error message.
	* util.cpp (terminate): Added executable and target name to output.
	* output.h (parse_output): Altered prototype.
	* exec.h (exec_file): Ditto.
	* output.cpp (FILE_TEST, check_example): Altered check_example to
	remove reliance on the diff utility, remove FILE_TEST as unneeded.
	* output.cpp (check_test, check_compat_test, parse_output): Moved
	opening of output file to parse_output.
	* exec.cpp (wait_for_child, exec_file): Used warn() utility.
	* runall.cpp (check_target_ok): Ditto.
	* runall.cpp (process_results): Altered signature, alter call to
	parse_output.
	* runall.cpp (run_target): Set/used target_name global, alter calls
	to exec_file and process_results.

Modified:
    incubator/stdcxx/trunk/util/cmdopt.cpp
    incubator/stdcxx/trunk/util/cmdopt.h
    incubator/stdcxx/trunk/util/exec.cpp
    incubator/stdcxx/trunk/util/exec.h
    incubator/stdcxx/trunk/util/output.cpp
    incubator/stdcxx/trunk/util/output.h
    incubator/stdcxx/trunk/util/runall.cpp
    incubator/stdcxx/trunk/util/util.cpp
    incubator/stdcxx/trunk/util/util.h

Modified: incubator/stdcxx/trunk/util/cmdopt.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/cmdopt.cpp?rev=426676&r1=426675&r2=426676&view=diff
==============================================================================
--- incubator/stdcxx/trunk/util/cmdopt.cpp (original)
+++ incubator/stdcxx/trunk/util/cmdopt.cpp Fri Jul 28 14:57:05 2006
@@ -34,11 +34,13 @@
 
 #include "cmdopt.h"
 
-int timeout = 10; /**< Child process timeout.  Default 10 */
-int compat = 0; /**< Test compatability mode switch.  Defaults to 0 (off) */
-const char* exe_opts = ""; /**< Command line switches for child processes */
-const char* in_root = ""; /**< Root directory for input/reference files */
+int timeout = 10; /**< Child process timeout.  Default 10. */
+int compat = 0; /**< Test compatability mode switch.  Defaults to 0 (off). */
+const char* exe_opts = ""; /**< Global command line switches for child 
+                                processes. */
+const char* in_root = ""; /**< Root directory for input/reference files. */
 const char* exe_name; /**< Alias for process argv [0]. */
+const char* target_name;
 
 /**
    Display command line switches for program and terminate.
@@ -73,6 +75,7 @@
    @param argv command line arguments
    @return number of command line arguments parsed.
    @see timeout
+   @see compat
    @see in_root
    @see exe_opts
 */
@@ -140,7 +143,7 @@
         }
             /* Intentionally falling through */
         default:
-            printf ("Unknown option: %s\n", argv [i]);
+            fprintf (stderr, "Unknown option: %s\n", argv [i]);
             show_usage (1);
         }
     }
@@ -151,11 +154,11 @@
 /**
    Translates exe_opts into an array that can be passed to exec ().
 
-   This method malloc ()s two blocks of memory.  The first block is the argv
-   index array.  This is the return value of this method.  The second block
-   is the parsed and split string contents the index referenced.  This block
-   is stored in subscript 1 of the return array.  It is the responsibility of
-   the calling method to free () both blocks.
+   This method malloc ()s two blocks of memory.  The first block is the 
+   generated argv index array.  This is the return value of this method.  The 
+   second block is the parsed and split string contents the index referenced.  
+   This block is stored in element 1 of the return array.  It is the 
+   responsibility of the calling method to free () both blocks.
 
    @warning this logic is UTF-8 unsafe
    @warning I/O redirection command piping isn't supported in the parse logic
@@ -171,10 +174,11 @@
     const char *pos;
     char *target, *last;
     char **table_pos, **argv;
+    const size_t optlen = strlen (exe_opts);
 
     assert (0 != exe_opts);
 
-    if (0 == strlen (exe_opts)) {
+    if (0 == optlen) {
         /* Alloc a an index array to hold the program name  */
         argv = (char**)RW_MALLOC (2 * sizeof (char*));
 
@@ -183,15 +187,14 @@
         return argv;
     }
 
-    table_pos = argv = (char**)RW_MALLOC (
-        (strlen (exe_opts) + 5) * sizeof (char*) / 2);
+    table_pos = argv = (char**)RW_MALLOC ((optlen + 5) * sizeof (char*) / 2);
     /* (strlen (exe_opts)+5)/2 is overkill for the most situations, but it is 
        just large enough to handle the worst case scenario.  The worst case 
        is a string similar to 'x y' or 'x y z', requiring array lengths of 4 
        and 5 respectively.
     */
 
-    last = target = argv [1] = (char*)RW_MALLOC (strlen (exe_opts) + 1);
+    last = target = argv [1] = (char*)RW_MALLOC (optlen + 1);
 
     /* Transcribe the contents, handling escaping and splitting */
     for (pos = exe_opts; *pos; ++pos) {

Modified: incubator/stdcxx/trunk/util/cmdopt.h
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/cmdopt.h?rev=426676&r1=426675&r2=426676&view=diff
==============================================================================
--- incubator/stdcxx/trunk/util/cmdopt.h (original)
+++ incubator/stdcxx/trunk/util/cmdopt.h Fri Jul 28 14:57:05 2006
@@ -32,12 +32,13 @@
 extern const char* exe_opts;
 extern const char* in_root;
 extern const char* exe_name;
+extern const char* target_name; /**< Alias for current target name. */
 
 void 
 show_usage(const int status);
 
 int 
-eval_options (const int argc, /* const */ char* const argv[]);
+eval_options (const int argc, char* const argv[]);
 
 char**
 split_child_opts();

Modified: incubator/stdcxx/trunk/util/exec.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/exec.cpp?rev=426676&r1=426675&r2=426676&view=diff
==============================================================================
--- incubator/stdcxx/trunk/util/exec.cpp (original)
+++ incubator/stdcxx/trunk/util/exec.cpp Fri Jul 28 14:57:05 2006
@@ -386,13 +386,13 @@
             }
             else if (ECHILD == errno) {
                 /* should not happen */
-                fprintf (stderr, "waitpid (%d) error: %s\n",
-                         (int)child_pid, strerror (errno));
+                warn ("waitpid (%d) error: %s\n", (int)child_pid, 
+                      strerror (errno));
             }
             else {
                 /* waitpid () error */
-                fprintf (stderr, "waitpid (%d) error: %s\n",
-                         (int)child_pid, strerror (errno));
+                warn ("waitpid (%d) error: %s\n", (int)child_pid, 
+                      strerror (errno));
             }
         }
         else if ((pid_t)0 == wait_pid) {
@@ -522,7 +522,7 @@
 }
 
 /**
-   Entry point to the watchdog subsystem.
+   Entry point to the child process (watchdog) subsystem.
 
    This method fork ()s, creating a child process.  This child process becomes
    a process group leader, redirects input and output files, then exec ()s
@@ -537,7 +537,7 @@
    @see wait_for_child ()
 */
 struct exec_attrs 
-exec_file (const char* exec_name, char** argv)
+exec_file (char** argv)
 {
     const pid_t child_pid = fork ();
 
@@ -546,7 +546,7 @@
 
         assert (0 != argv);
         assert (0 != argv [0]);
-        assert (0 != exec_name);
+        assert (0 != target_name);
 
         /* Set process group ID (so entire group can be killed)*/
         {
@@ -571,7 +571,7 @@
 
         /* Redirect stdin */
         {
-            const int intermit = open_input (exec_name);
+            const int intermit = open_input (target_name);
             replace_file (intermit, 0, "stdin");
         }
 
@@ -604,8 +604,8 @@
 
         execv (argv [0], argv);
 
-        fprintf (error_file, "execv (\"%s\", ...) error: %s\n",
-                 argv [0], strerror (errno));
+        fprintf (error_file, "%s (%s): execv (\"%s\", ...) error: %s\n",
+                 exe_name, target_name, argv [0], strerror (errno));
 
         exit (1);
     }
@@ -613,8 +613,8 @@
     if (-1 == child_pid) {
         /* Fake a failue to execute status return structure */
         struct exec_attrs state = {127, -1};
-        fprintf (stderr, "Unable to create child process for %s: %s\n",
-                 argv [0], strerror (errno));
+        warn ("Unable to create child process for %s: %s\n", argv [0],
+              strerror (errno));
         return state;
     }
 

Modified: incubator/stdcxx/trunk/util/exec.h
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/exec.h?rev=426676&r1=426675&r2=426676&view=diff
==============================================================================
--- incubator/stdcxx/trunk/util/exec.h (original)
+++ incubator/stdcxx/trunk/util/exec.h Fri Jul 28 14:57:05 2006
@@ -32,10 +32,8 @@
     int killed;
 };
 
-const char* 
-get_signame (int);
+const char* get_signame (int signo);
 
-struct exec_attrs 
-exec_file (const char*, char**);
+struct exec_attrs exec_file (char** argv);
 
 #endif   // RW_EXEC

Modified: incubator/stdcxx/trunk/util/output.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/output.cpp?rev=426676&r1=426675&r2=426676&view=diff
==============================================================================
--- incubator/stdcxx/trunk/util/output.cpp (original)
+++ incubator/stdcxx/trunk/util/output.cpp Fri Jul 28 14:57:05 2006
@@ -50,7 +50,7 @@
 
 
 /**
-   Parses output file out_name for test exec_name.
+   Parses output file out_name for test target_name.
    
    This method tries to open out_name.  If this succedes, it then searches
    the file for a result summary as produced by the rwtest driver.
@@ -68,30 +68,19 @@
      - 0 [assertion count] [failed assertion count] [pass rate]\n
        Parsed results
 
-   @param exec_name the name of the executable that generated the output file
-   @param out_name the name of the output file being parsed
+   @param data pointer to file structure for output file being parsed
 */
 static void
-check_test (const char* exec_name, const char* out_name)
+check_test (FILE* data)
 {
-    FILE* data = fopen (out_name, "r");
     unsigned r_lvl = 0, r_active = 0, r_total = 0;
     unsigned asserts = 0, failed = 0;
     int fmt_ok = 0;
     unsigned fsm = 0;
     char tok;
 
-    assert (0 != exec_name);
-    assert (0 != out_name);
-
-    if (0 == data) {
-        if (ENOENT != errno) {
-            printf ("Error opening %s: %s\n", out_name, strerror (errno));
-            return;
-        }
-        puts ("OUTPUT");
-        return;
-    }
+    assert (0 != target_name);
+    assert (0 != data);
 
     for (tok = fgetc (data); fsm < 6 && !feof (data); tok = fgetc (data)) {
         switch (tok) {
@@ -124,7 +113,7 @@
             if (6 < r_lvl) {
                 /* The 0.new tests produces errors, and are all 
                    expected to be active, so invert the total */
-                if (8 == r_lvl && 0 == strcmp (exec_name,"0.new"))
+                if (8 == r_lvl && 0 == strcmp (target_name, "0.new"))
                     r_active = r_total-r_active;
                 failed += r_active;
                 asserts += r_total;
@@ -148,40 +137,27 @@
     else {
         puts ("FORMAT");
     }
-
-    fclose (data);
 }
 
 /**
-   Parses output file out_name for test exec_name.
+   Parses output file out_name for test target_name.
    
    This method is a reimplementation of check_test ().  The difference between
    this method and check_test () is how it parses the results.  This version
    parses compatability layer output, rather than the test driver output.
 
-   @param exec_name the name of the executable that generated the output file
-   @param out_name the name of the output file being parsed
+   @param data pointer to file structure for output file being parsed
    @see check_test ()
 */
 static void
-check_compat_test (const char* out_name)
+check_compat_test (FILE* data)
 {
-    FILE* data = fopen (out_name, "r");
     unsigned asserts = 0, failed = 0;
     int read = 0;
     unsigned fsm = 0;
     char tok;
 
-    assert (0 != out_name);
-
-    if (0 == data) {
-        if (ENOENT != errno) {
-            printf ("Error opening %s: %s\n", out_name, strerror (errno));
-            return;
-        }
-        puts ("OUTPUT");
-        return;
-    }
+    assert (0 != data);
 
     fseek (data, -64, SEEK_END); /* Seek near the end of the file */
 
@@ -221,36 +197,27 @@
     else {
         puts ("FORMAT");
     }
-
-    fclose (data);
 }
 
 /**
-   Sanity test macro for file descriptor operations.
-   
-   @killme this should be removed after removing the dependancy on the
-   posix diff utility
-   
-   @param op human understandable name for operation
-   @param x variable to test the result for
-   @see check_example
+   Arbitrary constant controling static read buffer size.
+
+   @see check_example ()
 */
-#define FILE_TEST(op, x)                                                \
-    if (-1==(x))                                                        \
-        terminate (2, op " failed: %s\n", strerror (errno))
+#define DELTA_BUF_LEN 64
 
 /**
-   Parses output file out_name for the example exec_name.
+   Parses output file out_name for the example target_name.
    
    This method tries to compare out_name against a reference output file and
-   displays a result code.  The reference file is determined by exec_name and
+   displays a result code.  The reference file is determined by target_name and
    the in_root global variable.
    This method relies on the POSIX diff utility at this time.  This dependancy
    needs to be removed, though doing so will require a rewrite of the method.
 
    Reference file locations:
-     - [in_root]/manual/out/[exec_name].out
-     - [in_root]/tutorial/out/[exec_name].out
+     - [in_root]/manual/out/[target_name].out
+     - [in_root]/tutorial/out/[target_name].out
 
    Output messages produced:
      - NOREF\n
@@ -260,49 +227,54 @@
      - 0\n
        Output file matches the reference file (check passes)
 
-   @param exec_name the name of the executable that generated the output file
-   @param out_name the name of the output file being parsed
+   @todo add logic to handle differing line endings (CR vs LF vs CRLF)
+
+   @param output_name the name of the output file
+   @param data pointer to file structure for output file being parsed
    @see in_root
-   @see FILE_TEST ()
-   @todo remove dependancy on POSIX diff utility
 */
 static void
-check_example (const char* const exec_name, const char* const out_name)
+check_example (char* const out_name, FILE* output)
 {
     struct stat file_info;
     const size_t root_len = strlen (in_root);
     char* const ref_name = (char*)RW_MALLOC (root_len 
-                                            + strlen (exec_name) + 19);
-    int state = -1;
+                                             + strlen (target_name) + 19);
+    FILE* reference;
 
     assert (0 != in_root);
     assert (0 < root_len);
-    assert (0 != exec_name);
-    assert (0 != out_name);
+    assert (0 != target_name);
+    assert (0 != output);
 
-    /* Try in_root/manual/out/exec_name.out */
+    /* Try in_root/manual/out/target_name.out */
     memcpy (ref_name, in_root, root_len+1);
     strcat (ref_name, "/manual/out/");
-    strcat (ref_name, exec_name);
+    strcat (ref_name, target_name);
     strcat (ref_name, ".out");
 
     if (0 > stat (ref_name, &file_info)) {
         if (ENOENT != errno) {
-            printf ("stat (%s) error: %s\n", ref_name, strerror (errno));
+            warn ("stat (%s) error: %s\n", exe_name, ref_name, 
+                  strerror (errno));
+            puts ("BADREF");
             free (ref_name);
             return;
         }
                         
         /* If that doesn't exist, try 
-           in_root/tutorial/out/exec_name.out */
+           in_root/tutorial/out/target_name.out */
         memcpy (ref_name, in_root, root_len+1);
         strcat (ref_name, "/tutorial/out/");
-        strcat (ref_name, exec_name);
+        strcat (ref_name, target_name);
         strcat (ref_name, ".out");
 
         if (0 > stat (ref_name, &file_info)) {
-            if (ENOENT != errno)
-                printf ("stat (%s) error: %s\n", ref_name, strerror (errno));
+            if (ENOENT != errno) {
+                warn ("stat (%s) error: %s\n", exe_name, ref_name, 
+                      strerror (errno));
+                puts ("BADREF");
+            }
             else
                 puts (" NOREF");
 
@@ -311,93 +283,98 @@
         }
     }
 
-    const pid_t child_pid = fork ();
+    reference = fopen (ref_name, "r");
 
-    if (0 == child_pid) {   /* child */
-        /* Cache stdout (hopefully) for use if execv () fails */
-        int error_cache = dup (2);
-        FILE* error_file;
-        FILE_TEST ("dup (stderr)", error_cache);
-
-        FILE_TEST ("close (stdin)",close (0));
-        FILE_TEST ("close (stdin)",close (1));
-        FILE_TEST ("close (stderr)",close (2));
-
-        /* Todo: diff with --strip-trailing-cr on windows */
-        execlp ("diff", "diff", ref_name, out_name, (char *)0);
-
-        if ((error_file = fdopen (error_cache, "a")))
-            fprintf (error_file, "execlp (\"diff\", ...) error: %s\n",
-                     strerror (errno));
-
-        exit (2);
-    }
-
-    while (1) {
-        const pid_t wait_pid = waitpid (child_pid, &state, 0);
-
-        if (child_pid == wait_pid) {
-
-            if (WIFEXITED (state)) {
-                const int retcode = WEXITSTATUS (state);                
-                switch (retcode) {
-                case 0:
-                    puts ("     0");
-                    break;
-                case 1:
-                    puts ("OUTPUT");
-                    break;
-                default:
-                    printf ("diff returned %d\n", retcode);
-                }
+    if (0 == reference) {
+        int cache = errno; /* caching errno, as puts could alter it */
+        if (ENOENT != cache)
+            warn ("Error opening %s: %s\n", ref_name, strerror (cache));
+        puts ("BADREF");
+    }
+    else {
+        char out_buf [DELTA_BUF_LEN], ref_buf [DELTA_BUF_LEN];
+        size_t out_read, ref_read;
+        int match = 1;
+
+        while (!feof (reference) && !feof (output)) {
+            /* First, read a block from the files into the buffer */
+            out_read = fread (out_buf, DELTA_BUF_LEN, 1, output);
+            if (ferror (output)) {
+                warn ("Error reading %s: %s\n", out_name, strerror (errno));
+                match = 0;
                 break;
             }
-            else if (WIFSIGNALED (state)) {
-                printf ("diff exited with %s\n", 
-                        get_signame (WTERMSIG (state)));
+            ref_read = fread (ref_buf, DELTA_BUF_LEN, 1, reference);
+            if (ferror (reference)) {
+                warn ("Error reading %s: %s\n", ref_name, strerror (errno));
+                match = 0;
                 break;
             }
-/*
-            else if (WIFSTOPPED (state)) {
-                printf ("process %d stopped\n", (int)child_pid);
+
+            /* Then, check if the amount of data read or the state of the 
+               files differs
+            */
+            if (ref_read != out_read || feof (reference) != feof (output)) {
+                match = 0;
+                break;
             }
-            else if (WIFCONTINUED (state)) {
-                printf ("process %d continued\n", (int)child_pid);
+
+            /* Finally, check if the contents of the buffers differ */
+            if (0 != memcmp (out_buf, ref_buf, DELTA_BUF_LEN)) {
+                match = 0;
+                break;
             }
-*/
         }
-    }
 
+        if (match)
+            puts ("     0");
+        else
+            puts ("OUTPUT");
+
+        fclose (reference);
+    }
     free (ref_name);
 }
 
 /**
-   Dispatch method that invoks another method to parse the output file.
+   Umbrella (dispatch) function to analyse the (saved) output of target
 
-   @param target the path to the executable that generated the output file
-   @param exec_name the name of the executable that generated the output file
-   @see check_test ()
-   @see check_compat_test ()
-   @see check_example ()
+   @param target the path to the executable that generated the output file 
+   being parsed.
 */
 void
-parse_output (const char* target, const char* exec_name)
+parse_output (const char* target)
 {
     const size_t path_len = strlen (target);
     char* const out_name = (char*)RW_MALLOC (path_len + 5);
+    FILE* data;
+
+    assert (0 != target);
+
     memcpy (out_name, target, path_len + 1);
     strcat (out_name,".out");
 
-    if (!strlen (in_root)) {
-        /* If there is not an input directory, look at the assertion tags */
-        if (!compat)
-            check_test (exec_name, out_name);
-        else
-            check_compat_test (out_name);
+    data = fopen (out_name, "r");
+
+    if (0 == data) {
+        if (ENOENT != errno)
+            warn ("Error opening %s: %s\n", out_name, strerror (errno));
+        puts ("OUTPUT");
     }
     else {
-        /* Otherwise, diff against the output file */
-        check_example (exec_name, out_name);
+        if (!strlen (in_root)) {
+            /* If there is not an input directory, look at the assertion tags */
+
+            if (!compat)
+                check_test (data);
+            else
+                check_compat_test (data);
+        }
+        else {
+            /* Otherwise, diff against the output file */
+            check_example (out_name, data);
+        }
+        fclose (data);
     }
     free (out_name);
 }

Modified: incubator/stdcxx/trunk/util/output.h
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/output.h?rev=426676&r1=426675&r2=426676&view=diff
==============================================================================
--- incubator/stdcxx/trunk/util/output.h (original)
+++ incubator/stdcxx/trunk/util/output.h Fri Jul 28 14:57:05 2006
@@ -28,6 +28,6 @@
 #define OUTPUT_H
 
 void
-parse_output (const char*, const char*);
+parse_output (const char* target);
 
 #endif   // OUTPUT_H

Modified: incubator/stdcxx/trunk/util/runall.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/runall.cpp?rev=426676&r1=426675&r2=426676&view=diff
==============================================================================
--- incubator/stdcxx/trunk/util/runall.cpp (original)
+++ incubator/stdcxx/trunk/util/runall.cpp Fri Jul 28 14:57:05 2006
@@ -76,7 +76,8 @@
 
     if (0 > stat (target, &file_info)) {
         if (ENOENT != errno) {
-            printf ("Stat error: %s\n", strerror (errno));
+            warn ("Error stating %s: %s\n", target, strerror (errno));
+            puts ("ERROR");
             return 0;
         }
         file_info.st_mode = 0; /* force mode on non-existant file to 0 */
@@ -110,8 +111,10 @@
         strcat (tmp_name,".o");
 
         if (0 > stat (tmp_name, &file_info)) {
-            if (ENOENT != errno)
-                printf ("stat (%s) error: %s\n", tmp_name, strerror (errno));
+            if (ENOENT != errno) {
+                warn ("Error stating %s: %s\n", tmp_name, strerror (errno));
+                puts ("ERROR");
+            }
             else
                 puts ("  COMP");
         }
@@ -152,11 +155,10 @@
    @see check_example ()
 */
 static void
-process_results (const char* target, const char* exec_name, 
-                 const struct exec_attrs* result)
+process_results (const char* target, const struct exec_attrs* result)
 {
     if (0 == result->status) {
-        parse_output (target, exec_name);
+        parse_output (target);
     } 
     else if (WIFEXITED (result->status)) {
         const int retcode = WEXITSTATUS (result->status);
@@ -229,22 +231,22 @@
 run_target (char* target, char** childargv)
 {
     struct exec_attrs status;
-    const char* const exec_name = rw_basename (target);
 
     assert (0 != target);
     assert (0 != childargv);
 
     childargv [0] = target;
+    target_name = rw_basename (target);
 
-    printf ("%-18.18s ", exec_name);
+    printf ("%-18.18s ", target_name);
     fflush (stdout);
 
     if (!check_target_ok (target))
         return;
 
-    status = exec_file (exec_name, childargv);
+    status = exec_file (childargv);
 
-    process_results (target, exec_name, &status);
+    process_results (target, &status);
 }
 
 /**

Modified: incubator/stdcxx/trunk/util/util.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/util.cpp?rev=426676&r1=426675&r2=426676&view=diff
==============================================================================
--- incubator/stdcxx/trunk/util/util.cpp (original)
+++ incubator/stdcxx/trunk/util/util.cpp Fri Jul 28 14:57:05 2006
@@ -28,8 +28,24 @@
 #include <string.h> /* for strerror */
 #include <sys/types.h> /* for size_t */
 
+#include "cmdopt.h" /* for exe_name, target_name */
+
 #include "util.h"
 
+void
+warn (const char* const format, ...)
+{
+    va_list args;
+
+    assert (0 != format);
+
+    fprintf (stderr, "%s (%s): ", exe_name, target_name);
+
+    va_start (args, format);
+    vfprintf (stderr, format, args);
+    va_end (args);
+}
+
 /**
    Wrapper for exit (), providing a terminal error message on stderr.
 
@@ -43,6 +59,8 @@
 
     assert (0 != format);
     assert (0 != state);
+
+    fprintf (stderr, "%s (%s): ", exe_name, target_name);
 
     va_start (args, format);
     vfprintf (stderr, format, args);

Modified: incubator/stdcxx/trunk/util/util.h
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/util.h?rev=426676&r1=426675&r2=426676&view=diff
==============================================================================
--- incubator/stdcxx/trunk/util/util.h (original)
+++ incubator/stdcxx/trunk/util/util.h Fri Jul 28 14:57:05 2006
@@ -27,6 +27,13 @@
 #ifndef RW_UTIL_H
 #define RW_UTIL_H
 
+/**
+   Generates a non-terminal error message on stderr.
+
+   @param format printf () format string to display on stderr
+*/
+void warn (const char* const format, ...);
+
 void terminate ( const int state, const char* const format, ... );
 
 /* Note: RW_MALLOC should be used rather than malloc within the runall