~493pocbrcycmdw7yksonho9o2qzz-o18bz-d18ecat4t1b76tkfi3vttrkfngli/libmemcached/libmemcached

« back to all changes in this revision

Viewing changes to libtest/exception.cc

  • Committer: Continuous Integration
  • Date: 2013-04-21 01:20:30 UTC
  • mfrom: (1159.1.1 libmemcached-1.0)
  • Revision ID: ci@tangent.org-20130421012030-0ztye5mh26tm1bqm
Merge lp:~brianaker/libmemcached/exception-cleanup Build: jenkins-Libmemcached-271

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
 
2
 *
 
3
 *  Data Differential YATL (i.e. libtest)  library
 
4
 *
 
5
 *  Copyright (C) 2012-2013 Data Differential, http://datadifferential.com/
 
6
 *
 
7
 *  Redistribution and use in source and binary forms, with or without
 
8
 *  modification, are permitted provided that the following conditions are
 
9
 *  met:
 
10
 *
 
11
 *      * Redistributions of source code must retain the above copyright
 
12
 *  notice, this list of conditions and the following disclaimer.
 
13
 *
 
14
 *      * Redistributions in binary form must reproduce the above
 
15
 *  copyright notice, this list of conditions and the following disclaimer
 
16
 *  in the documentation and/or other materials provided with the
 
17
 *  distribution.
 
18
 *
 
19
 *      * The names of its contributors may not be used to endorse or
 
20
 *  promote products derived from this software without specific prior
 
21
 *  written permission.
 
22
 *
 
23
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 
24
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 
25
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 
26
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 
27
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
28
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 
29
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
30
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
31
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
32
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 
33
 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
34
 *
 
35
 */
 
36
 
 
37
#include "libtest/yatlcon.h"
 
38
#include <libtest/common.h>
 
39
#include <cstdarg>
 
40
 
 
41
namespace libtest {
 
42
 
 
43
exception::exception(const char *file_arg, int line_arg, const char *func_arg):
 
44
  std::exception(),
 
45
  _line(line_arg),
 
46
  _file(file_arg),
 
47
  _func(func_arg),
 
48
  _error_message(NULL),
 
49
  _error_message_size(0)
 
50
{
 
51
}
 
52
 
 
53
#ifndef __INTEL_COMPILER
 
54
# pragma GCC diagnostic ignored "-Wformat-nonliteral"
 
55
#endif
 
56
void exception::init(va_list args_)
 
57
{
 
58
  const char *format= va_arg(args_, const char *);
 
59
  int error_message_length= vasprintf(&_error_message, format, args_);
 
60
  assert(error_message_length != -1);
 
61
  if (error_message_length > 0)
 
62
  {
 
63
    _error_message_size= error_message_length +1;
 
64
  }
 
65
}
 
66
 
 
67
exception::~exception() throw()
 
68
{
 
69
  if (_error_message)
 
70
  {
 
71
    free(_error_message);
 
72
  }
 
73
}
 
74
 
 
75
void exception::what(size_t length_, const char* message_)
 
76
{
 
77
  if (length_ > 0 and message_)
 
78
  {
 
79
    char *ptr= (char*) realloc(_error_message, length_ +1);
 
80
    if (ptr)
 
81
    {
 
82
      _error_message= ptr;
 
83
      memcpy(_error_message, message_, length_);
 
84
      _error_message[length_]= 0;
 
85
    }
 
86
  }
 
87
}
 
88
 
 
89
exception::exception(const exception& other) :
 
90
  std::exception(),
 
91
  _line(other._line),
 
92
  _file(other._file),
 
93
  _func(other._func),
 
94
  _error_message_size(0)
 
95
{
 
96
  if (other.length() > 0)
 
97
  {
 
98
    _error_message= (char*) malloc(other.length() +1);
 
99
    if (_error_message)
 
100
    {
 
101
      memcpy(_error_message, other._error_message, other.length());
 
102
      _error_message_size= other.length();
 
103
    }
 
104
  }
 
105
}
 
106
 
 
107
} // namespace libtest
 
108