options: fail if the debug or trace tag specified doesn't exist (-d -t)
authorFrançois Bobot <francois@bobot.eu>
Fri, 4 May 2012 14:28:08 +0000 (14:28 +0000)
committerFrançois Bobot <francois@bobot.eu>
Fri, 4 May 2012 14:28:08 +0000 (14:28 +0000)
src/util/configuration.cpp
src/util/configuration.h
src/util/options.cpp

index 9b4d32e0b7446dec84e3b6c64c6a3cdbc6adc4d5..abda24c26b3ec7a4a54cf169fe97d137bc3fa9c8 100644 (file)
@@ -19,6 +19,8 @@
  **/
 
 #include <string>
+#include <string.h>
+#include <stdlib.h>
 #include <sstream>
 
 #include "util/configuration.h"
@@ -147,6 +149,21 @@ char const* const* Configuration::getDebugTags() {
 #endif /* CVC4_DEBUG */
 }
 
+int strcmpptr(const char **s1, const char **s2){
+  return strcmp(*s1,*s2);
+}
+
+bool Configuration::isDebugTag(char const *){
+#if CVC4_DEBUG
+  unsigned ntags = getNumDebugTags();
+  char const* const* tags = getDebugTags();
+  return (bsearch(&optarg, tags, ntags, sizeof(char *),
+                  (int(*)(const void*,const void*))strcmpptr) != NULL);
+#else /* CVC4_DEBUG */
+  return false;
+#endif /* CVC4_DEBUG */
+}
+
 unsigned Configuration::getNumTraceTags() {
 #if CVC4_TRACING
   /* -1 because a NULL pointer is inserted as the last value */
@@ -165,6 +182,17 @@ char const* const* Configuration::getTraceTags() {
 #endif /* CVC4_TRACING */
 }
 
+bool Configuration::isTraceTag(char const *){
+#if CVC4_TRACING
+  unsigned ntags = getNumTraceTags();
+  char const* const* tags = getTraceTags();
+  return (bsearch(&optarg, tags, ntags, sizeof(char *),
+                  (int(*)(const void*,const void*))strcmpptr) != NULL);
+#else /* CVC4_TRACING */
+  return false;
+#endif /* CVC4_TRACING */
+}
+
 bool Configuration::isSubversionBuild() {
   return IS_SUBVERSION_BUILD;
 }
index 1bd48999e0399b5a4962910d8b839de349e7e85a..b1ef7154d92270c5be2fe65ef2fce975f0d7eada 100644 (file)
@@ -89,11 +89,19 @@ public:
 
   static bool isBuiltWithTlsSupport();
 
+  /* Return the number of debug tags */
   static unsigned getNumDebugTags();
+  /* Return a sorted array of the debug tags name */
   static char const* const* getDebugTags();
+  /* Test if the given argument is a known debug tag name */
+  static bool isDebugTag(char const *);
 
+  /* Return the number of trace tags */
   static unsigned getNumTraceTags();
+  /* Return a sorted array of the trace tags name */
   static char const* const* getTraceTags();
+  /* Test if the given argument is a known trace tag name */
+  static bool isTraceTag(char const *);
 
   static bool isSubversionBuild();
   static const char* getSubversionBranchName();
index 4e8bc375bb716b45183bf3b0d0c1ef0ff225d54f..e87c240a8c25c6f9a207158499caa15c821fe6ac 100644 (file)
@@ -538,10 +538,24 @@ throw(OptionException) {
       break;
 
     case 't':
+      if(Configuration::isTracingBuild()) {
+        if(!Configuration::isTraceTag(optarg))
+          throw OptionException(string("trace tag ") + optarg +
+                                string(" not available"));
+      } else {
+        throw OptionException("trace tags not available in non-tracing build");
+      }
       Trace.on(optarg);
       break;
 
     case 'd':
+      if(Configuration::isDebugBuild()) {
+        if(!Configuration::isDebugTag(optarg))
+          throw OptionException(string("debug tag ") + optarg +
+                                string(" not available"));
+      } else {
+        throw OptionException("debug tags not available in non-debug build");
+      }
       Debug.on(optarg);
       Trace.on(optarg);
       break;