1 //***************************************************************************/
2 // This software is released under the 2-Clause BSD license, included
3 // below.
4 //
5 // Copyright (c) 2019, Aous Naman
6 // Copyright (c) 2019, Kakadu Software Pty Ltd, Australia
7 // Copyright (c) 2019, The University of New South Wales, Australia
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are
11 // met:
12 //
13 // 1. Redistributions of source code must retain the above copyright
14 // notice, this list of conditions and the following disclaimer.
15 //
16 // 2. Redistributions in binary form must reproduce the above copyright
17 // notice, this list of conditions and the following disclaimer in the
18 // documentation and/or other materials provided with the distribution.
19 //
20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
21 // IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 // TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
23 // PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 // HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
26 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 //***************************************************************************/
32 // This file is part of the OpenJPH software implementation.
33 // File: ojph_message.h
34 // Author: Aous Naman
35 // Date: 29 August 2019
36 //***************************************************************************/
37 
38 #ifndef OJPH_MESSAGE_H
39 #define OJPH_MESSAGE_H
40 
41 #include <cstring>
42 #include "ojph_arch.h"
43 
44 namespace ojph {
45 
46   ////////////////////////////////////////////////////////////////////////////
47   enum OJPH_MSG_LEVEL : int
48   {
49     NO_MSG = 0,
50     INFO = 1,
51     WARN = 2,
52     ERROR = 3
53   };
54 
55   ////////////////////////////////////////////////////////////////////////////
56   class message_base {
57   public:
58     OJPH_EXPORT
59       virtual void operator() (int warn_code, const char* file_name,
60         int line_num, const char *fmt, ...) = 0;
61   };
62 
63   ////////////////////////////////////////////////////////////////////////////
64   class message_info : public message_base
65   {
66     public:
67       OJPH_EXPORT
68       virtual void operator() (int info_code, const char* file_name,
69         int line_num, const char* fmt, ...);
70   };
71 
72   ////////////////////////////////////////////////////////////////////////////
73   OJPH_EXPORT
74     void set_info_stream(FILE* s);
75   OJPH_EXPORT
76     void configure_info(message_info* info);
77   OJPH_EXPORT
78     message_info& get_info();
79 
80   ////////////////////////////////////////////////////////////////////////////
81   class message_warning : public message_base
82   {
83     public:
84       OJPH_EXPORT
85       virtual void operator() (int warn_code, const char* file_name,
86         int line_num, const char* fmt, ...);
87   };
88 
89   ////////////////////////////////////////////////////////////////////////////
90   OJPH_EXPORT
91     void set_warning_stream(FILE* s);
92   OJPH_EXPORT
93     void configure_warning(message_warning* warn);
94   OJPH_EXPORT
95     message_warning& get_warning();
96 
97   ////////////////////////////////////////////////////////////////////////////
98   class message_error : public message_base
99   {
100     public:
101       OJPH_EXPORT
102       virtual void operator() (int warn_code, const char* file_name,
103         int line_num, const char *fmt, ...);
104   };
105 
106   ////////////////////////////////////////////////////////////////////////////
107   OJPH_EXPORT
108   void set_error_stream(FILE *s);
109   OJPH_EXPORT
110   void configure_error(message_error* error);
111   OJPH_EXPORT
112   message_error& get_error();
113 }
114 
115 //////////////////////////////////////////////////////////////////////////////
116 #if (defined OJPH_OS_WINDOWS)
117   #define __OJPHFILE__ \
118     (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
119 #else
120   #define __OJPHFILE__ \
121     (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
122 #endif
123 
124 //////////////////////////////////////////////////////////////////////////////
125 #define OJPH_INFO(t, ...) \
126   { ojph::get_info()(t, __OJPHFILE__, __LINE__, __VA_ARGS__); }
127 //////////////////////////////////////////////////////////////////////////////
128 #define OJPH_WARN(t, ...) \
129   { ojph::get_warning()(t, __OJPHFILE__, __LINE__, __VA_ARGS__); }
130 //////////////////////////////////////////////////////////////////////////////
131 #define OJPH_ERROR(t, ...) \
132   { ojph::get_error()(t, __OJPHFILE__, __LINE__,__VA_ARGS__); }
133 
134 
135 #endif // !OJPH_MESSAGE_H
136