initial release of jp3d library and codec
[openjpeg.git] / libjp3dvm / 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_CALLCONV 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