Use AM_LDFLAGS instead of LDFLAGS
[yazpp-moved-to-github.git] / zoom / zexcept.cpp
index e37edfc..6a684f0 100644 (file)
@@ -1,12 +1,12 @@
-// $Header: /home/cvsroot/yaz++/zoom/zexcept.cpp,v 1.2 2002-10-08 23:57:29 mike Exp $
+// $Header: /home/cvsroot/yaz++/zoom/zexcept.cpp,v 1.10 2003-09-22 12:30:01 mike Exp $
 
 // Z39.50 Exception classes
 
+#include <iostream>
 #include <errno.h>
 #include <string.h>            // for strerror(), strlen(), strcpy()
-#include <stdio.h>             // for sprintf()
-#include <yaz/diagbib1.h>
-#include "zoom++.h"
+#include <stdio.h>
+#include "zoom.h"
 
 
 namespace ZOOM {
@@ -14,50 +14,54 @@ namespace ZOOM {
        code = errcode;
     }
 
+    exception::~exception() {
+       // Nothing to do, but G++ requires this to be explicit anyway
+    }
+
     int exception::errcode() const {
        return code;
     }
 
-    const char *exception::errmsg() const {
-       static char buf[40];
+    std::string exception::errmsg() const {
+       char buf[40];
        sprintf(buf, "error #%d", code);
        return buf;
     }
 
 
 
-    systemException::systemException() : exception::exception(errno){
+    systemException::systemException() : exception(errno){
        code = errno;
     }
 
-    int systemException::errcode() const {
-       return code;
-    }
-
-    const char *systemException::errmsg() const {
-       return strerror(code);
+    std::string systemException::errmsg() const {
+       // For thread safety on linux (and most unix systems), we need
+       // to use the reentrant version of the error translation
+       // function.  Microsoft's strerror() is thread safe, since it
+       // returns a pointer to thread local storage.  Unfortunately
+       // there several different reentrant versions.  Here, we check
+       // for glibc, since we are using gcc.  It appears at least the
+       // current version of gcc has strerror_r() available by
+       // default.
+       #ifdef __GLIBC__
+           char buf[1024];
+           // PJD: result not necessarily equal to buf
+           const char* result = strerror_r(code, buf, sizeof(buf));
+           if (result != 0)
+               return result;
+           return exception::errmsg();
+       #else
+           return strerror(code);
+       #endif
     }
 
 
     
-    bib1Exception::bib1Exception(int errcode, const char *addinfo) :
-       exception::exception(errcode) {
-       info = new char[strlen(addinfo)+1];
-       strcpy((char*) info, addinfo);
-       //fprintf(stderr, "made new bib1Exception 0x%lx (%d, 0x%lx=%s)\n",
-               //(long) this, code, (long) info, info);
-    }
-
-#if 0
-    bib1Exception::bib1Exception(bib1Exception& src) :
-       exception::exception(src) {
-        code = src.code;
-       info = new char[strlen(src.info)+1];
-       strcpy((char*) info, src.info);
-       //fprintf(stderr, "copied bib1Exception 0x%lx to 0x%lx (%d, 0x%lx=%s)\n",
-               //(long) &src, (long) this, code, (long) info, info);
+    bib1Exception::bib1Exception(int errcode, const std::string &addinfo) :
+       exception(errcode), info(addinfo) {
+       // std::cerr << "WARNING: made bib1Exception(" << errcode << "=" <<
+       //   ZOOM_diag_str(errcode) << ", '" << addinfo << "')\n";
     }
-#endif
 
     bib1Exception::~bib1Exception() {
        //fprintf(stderr, "deleting bib1Exception 0x%lx (%d, 0x%lx=%s)\n",
@@ -66,38 +70,27 @@ namespace ZOOM {
        //  ### Don't actually do the deletion for now.  Exception
        //  reference semantics are too weird for me to grok so I'm
        //  doing The Wrong Thing in the knowledge that it will more
-       //  or less work -- it just leaks memory.
+       //  or less work -- it just leaks memory.  (Or does it?)
     }
 
-    int bib1Exception::errcode() const {
-       return code;
-    }
-
-    const char *bib1Exception::errmsg() const {
-       return diagbib1_str(code);
+    std::string bib1Exception::errmsg() const {
+       return ZOOM_diag_str(code);
     }
 
-    const char *bib1Exception::addinfo() const {
+    std::string bib1Exception::addinfo() const {
        return info;
     }
 
 
 
-    queryException::queryException(int qtype, const char *source) :
-       exception::exception(qtype) {
-       q = new char[strlen(source)+1];
-       strcpy((char*) q, source);
-    }
+    queryException::queryException(int qtype, const std::string &source) :
+       exception(qtype), q(source) {}
 
     queryException::~queryException() {
-       delete q;
-    }
-
-    int queryException::errcode() const {
-       return code;
+       //delete q; // ### see comment on bib1Exception destructor
     }
 
-    const char *queryException::errmsg() const {
+    std::string queryException::errmsg() const {
        switch (code) {
        case PREFIX: return "bad prefix search";
        case CCL: return "bad CCL search";
@@ -106,7 +99,7 @@ namespace ZOOM {
        return "bad search (unknown type)";
     }
 
-    const char *queryException::addinfo() const {
+    std::string queryException::addinfo() const {
        return q;
     }
 }