stdcpp/tsrc/Stdcpp_test/stdcxx/testengine/src/opt_trace.cpp
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stdcpp/tsrc/Stdcpp_test/stdcxx/testengine/src/opt_trace.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,194 @@
+/************************************************************************
+ *
+ * opt_trace.cpp - definitions of tracing option handlers
+ *
+ * $Id: opt_trace.cpp 290026 2005-09-19 00:12:38Z sebor $
+ *
+ ************************************************************************
+ *
+ * Copyright (c) 1994-2005 Quovadx,  Inc., acting through its  Rogue Wave
+ * Software division. Licensed under the Apache License, Version 2.0 (the
+ * "License");  you may  not use this file except  in compliance with the
+ * License.    You    may   obtain   a   copy   of    the   License    at
+ * http://www.apache.org/licenses/LICENSE-2.0.    Unless   required    by
+ * applicable law  or agreed to  in writing,  software  distributed under
+ * the License is distributed on an "AS IS" BASIS,  WITHOUT WARRANTIES OR
+ * CONDITIONS OF  ANY KIND, either  express or implied.  See  the License
+ * for the specific language governing permissions  and limitations under
+ * the License.
+ *
+ **************************************************************************/
+
+// expand _TEST_EXPORT macros
+#define _RWSTD_TEST_SRC
+
+#include "opt_trace.h"
+
+#include <stdio.h>    // for fprintf()
+#include <stdlib.h>   // for strtol()
+#include <string.h>   // for strchar()
+
+/************************************************************************/
+
+// masked diagnostics (those that shouldn't be issued)
+int _rw_diag_mask = 1 << diag_trace;
+
+
+int
+_rw_setopt_trace_mask (int argc, char *argv[])
+{
+    if (1 == argc && argv && 0 == argv [0]) {
+        static const char helpstr[] = {
+            "Specifies the severity of diagnostic messages to be issued when\n"
+            "active. By default, diagnostics with severity of 3 and and above\n"
+            "are issued, all others are suppressed. The severity of an inactive"
+            "\ndiagnostic is always zero, regardless of what the severity would"
+            "\nbe if it were active.\n\n"
+            "The syntax of <arg> is as follows:\n"
+            "<arg>   ::= <range> [ , <range> ]\n"
+            "<range> ::= [ - ] <digit> | <digit> - [ <digit> ]\n"
+            "<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9\n"
+            "\n"
+            "The default names of the diagnostic messages arranged in order\n"
+            "of increasing severity are as follows:\n"
+            "ITRACE, TRACE, DEBUG, INFO, NOTE, WARNING, ASSERTION, UNUSED,\n"
+            "ERROR, and FATAL.\n"
+            "The name of each inactive diagnostic is preceded by the name\n"
+            "of the severity-0 diagnostic (ITRACE_ by default). The severity\n"
+            "of an inactive diagnostic is always zero, regardless of what\n"
+            "the severity would be if it were active.\n"
+        };
+
+        argv [0] = _RWSTD_CONST_CAST (char*, helpstr);
+
+        return 0;
+    }
+
+    char *parg = strchr (argv [0], '=');
+
+    if (0 == parg) {
+        _rw_diag_mask = 0;
+        return 0;
+    }
+        
+    int diag_set = 0;
+
+    const char* const argbeg = ++parg;
+
+    // the lower bound of a range of severities to be enabled or disabled
+    // negative values are not valid and denote an implicit lower bound
+    // of 1 (such as in "-3" which is a shorthand for "1-3")
+    long first = -1;
+
+    for ( ; '\0' != *parg ; ) {
+
+        // skip any leading whitespace
+        for ( ; ' ' == *parg; ++parg);
+
+        if ('-' == *parg) {
+            if (first < 0) {
+                first = 0;
+                ++parg;
+            }
+            else {
+                fprintf (stderr,
+                         "invalid character '%c' at position %d: \"%s\"\n",
+                         *parg, int (parg - argbeg), argv [0]);
+                return 2;
+            }
+        }
+
+        // parse a numeric argument
+        char *end;
+        long severity = strtol (parg, &end, 0);
+
+        // skip any trailing whitespace
+        for ( ; ' ' == *end; ++end);
+
+        if (end == parg || '-' != *end && ',' != *end && '\0' != *end) {
+            fprintf (stderr,
+                     "invalid character '%c' at position %d: \"%s\"\n",
+                     *end, int (parg - argbeg), argv [0]);
+            return 2;
+        }
+
+        if (0 <= first) {
+            if (severity < 0 || N_DIAG_TYPES < severity) {
+                fprintf (stderr,
+                         "invalid value %ld at position %d: \"%s\"\n",
+                         severity, int (parg - argbeg), argv [0]);
+                return 2;
+            }
+
+            ++severity;
+
+            if ((',' == *end || '-' == *end) && end [1])
+                ++end;
+        }
+        else if (',' == *end) {
+            first = severity++;
+            if ('\0' == end [1]) {
+                fprintf (stderr,
+                         "invalid character '%c' at position %d: \"%s\"\n",
+                         *end, int (parg - argbeg), argv [0]);
+                return 2;
+            }
+
+            ++end;
+        }
+        else if ('-' == *end) {
+            first = severity;
+            while (' ' == *++end);
+            if ('\0' == *end) {
+                severity = N_DIAG_TYPES;
+            }
+            else if  (',' == *end) {
+                severity = N_DIAG_TYPES;
+                ++end;
+            }
+            else
+                severity = -1;
+        }
+        else if ('\0' == *end) {
+            first = severity++;
+        }
+        else {
+            fprintf (stderr,
+                     "invalid character '%c' at position %d: \"%s\"\n",
+                     *end, int (parg - argbeg), argv [0]);
+            return 2;
+        }
+
+        parg = end;
+
+        if (0 <= first && first < severity) {
+            for (int i = first; i != severity; ++i)
+                diag_set |= 1 << i;
+            severity = -1;
+        }
+    }
+
+    _rw_diag_mask = ~diag_set;
+
+    return 0;
+}
+
+/************************************************************************/
+
+int
+_rw_setopt_trace (int argc, char *argv[])
+{
+    if (1 == argc && argv && 0 == argv [0]) {
+        static const char helpstr[] = {
+            "Specifies that diagnostic messages of all severities be issued\n"
+            "regardless of whether they are active or not. See the --severity\n"
+            "option for details.\n"
+        };
+
+        argv [0] = _RWSTD_CONST_CAST (char*, helpstr);
+
+        return 0;
+    }
+
+    return _rw_setopt_trace_mask (argc, argv);
+}