]> Creatis software - gdcm.git/blob - src/gdcmopenjpeg/libopenjpeg/event.c
5dd162d1cad0d6cff60322455d456739f0862dd5
[gdcm.git] / src / gdcmopenjpeg / libopenjpeg / event.c
1 /*\r
2  * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  * 1. Redistributions of source code must retain the above copyright\r
9  *    notice, this list of conditions and the following disclaimer.\r
10  * 2. Redistributions in binary form must reproduce the above copyright\r
11  *    notice, this list of conditions and the following disclaimer in the\r
12  *    documentation and/or other materials provided with the distribution.\r
13  *\r
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
18  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
24  * POSSIBILITY OF SUCH DAMAGE.\r
25  */\r
26 \r
27 #include "opj_includes.h"\r
28 \r
29 /* ==========================================================\r
30      Utility functions\r
31    ==========================================================*/\r
32 \r
33 #ifndef WIN32\r
34 static char*\r
35 i2a(unsigned i, char *a, unsigned r) {\r
36   if (i/r > 0) a = i2a(i/r,a,r);\r
37   *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%r];\r
38   return a+1;\r
39 }\r
40 \r
41 /** \r
42  Transforms integer i into an ascii string and stores the result in a; \r
43  string is encoded in the base indicated by r.\r
44  @param i Number to be converted\r
45  @param a String result\r
46  @param r Base of value; must be in the range 2 - 36\r
47  @return Returns a\r
48 */\r
49 static char *\r
50 _itoa(int i, char *a, int r) {\r
51   r = ((r < 2) || (r > 36)) ? 10 : r;\r
52   if(i < 0) {\r
53     *a = '-';\r
54     *i2a(-i, a+1, r) = 0;\r
55   }\r
56   else *i2a(i, a, r) = 0;\r
57   return a;\r
58 }\r
59 \r
60 #endif /* !WIN32 */\r
61 \r
62 /* ----------------------------------------------------------------------- */\r
63 \r
64 opj_event_mgr_t* opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) {\r
65   if(cinfo) {\r
66     opj_event_mgr_t *previous = cinfo->event_mgr;\r
67     cinfo->event_mgr = event_mgr;\r
68     cinfo->client_data = context;\r
69     return previous;\r
70   }\r
71 \r
72   return NULL;\r
73 }\r
74 \r
75 bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) {\r
76 #define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */\r
77   opj_msg_callback msg_handler = NULL;\r
78 \r
79   opj_event_mgr_t *event_mgr = cinfo->event_mgr;\r
80   if(event_mgr != NULL) {\r
81     switch(event_type) {\r
82       case EVT_ERROR:\r
83         msg_handler = event_mgr->error_handler;\r
84         break;\r
85       case EVT_WARNING:\r
86         msg_handler = event_mgr->warning_handler;\r
87         break;\r
88       case EVT_INFO:\r
89         msg_handler = event_mgr->info_handler;\r
90         break;\r
91       default:\r
92         break;\r
93     }\r
94     if(msg_handler == NULL) {\r
95       return false;\r
96     }\r
97   } else {\r
98     return false;\r
99   }\r
100 \r
101   if ((fmt != NULL) && (event_mgr != NULL)) {\r
102     va_list arg;\r
103     int str_length, i, j;\r
104     char message[MSG_SIZE];\r
105     memset(message, 0, MSG_SIZE);\r
106     /* initialize the optional parameter list */\r
107     va_start(arg, fmt);\r
108     /* check the length of the format string */\r
109     str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt);\r
110     /* parse the format string and put the result in 'message' */\r
111     for (i = 0, j = 0; i < str_length; ++i) {\r
112       if (fmt[i] == '%') {\r
113         if (i + 1 < str_length) {\r
114           switch(tolower(fmt[i + 1])) {\r
115             case '%' :\r
116               message[j++] = '%';\r
117               break;\r
118             case 'o' : /* octal numbers */\r
119             {\r
120               char tmp[16];\r
121               _itoa(va_arg(arg, int), tmp, 8);\r
122               strcat(message, tmp);\r
123               j += strlen(tmp);\r
124               ++i;\r
125               break;\r
126             }\r
127             case 'i' : /* decimal numbers */\r
128             case 'd' :\r
129             {\r
130               char tmp[16];\r
131               _itoa(va_arg(arg, int), tmp, 10);\r
132               strcat(message, tmp);\r
133               j += strlen(tmp);\r
134               ++i;\r
135               break;\r
136             }\r
137             case 'x' : /* hexadecimal numbers */\r
138             {\r
139               char tmp[16];\r
140               _itoa(va_arg(arg, int), tmp, 16);\r
141               strcat(message, tmp);\r
142               j += strlen(tmp);\r
143               ++i;\r
144               break;\r
145             }\r
146             case 's' : /* strings */\r
147             {\r
148               char *tmp = va_arg(arg, char*);\r
149               strcat(message, tmp);\r
150               j += strlen(tmp);\r
151               ++i;\r
152               break;\r
153             }\r
154             case 'f' :  /* floats */\r
155             {\r
156               char tmp[16];\r
157               double value = va_arg(arg, double);\r
158               sprintf(tmp, "%f", value);\r
159               strcat(message, tmp);\r
160               j += strlen(tmp);\r
161               ++i;\r
162               break;\r
163             }\r
164           };\r
165         } else {\r
166           message[j++] = fmt[i];\r
167         }\r
168       } else {\r
169         message[j++] = fmt[i];\r
170       };\r
171     }\r
172     /* deinitialize the optional parameter list */\r
173     va_end(arg);\r
174 \r
175     /* output the message to the user program */\r
176     msg_handler(message, cinfo->client_data);\r
177   }\r
178 \r
179   return true;\r
180 }\r
181 \r