OSDN Git Service

[COMMON] Add pair16_t and pair64_t.
[csp-qt/common_source_project-fm7.git] / source / src / common.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2006.08.18 -
6
7         [ common header ]
8 */
9
10 #ifndef _COMMON_H_
11 #define _COMMON_H_
12
13 // move shared codes to DLL???
14 //#ifdef _USE_QT
15 //      #define USE_SHARED_DLL
16 //#endif
17
18 // use zlib to decompress gzip file???
19 #ifdef _WIN32
20         #if defined(_MSC_VER) && (_MSC_VER >= 1500)
21                 #ifndef _ANY2D88
22                         #define USE_ZLIB
23                 #endif
24         #endif
25 #endif
26 #ifdef _USE_OT
27                         #define USE_ZLIB
28 #endif
29
30 // check environemnt/language
31 #ifdef _WIN32
32         #ifdef _MSC_VER
33                 // Microsoft Visual C++
34                 #if _MSC_VER == 1200
35                         // variable scope of 'for' loop for Microsoft Visual C++ 6.0
36                         #define for if(0);else for
37                 #endif
38                 #if _MSC_VER >= 1200
39                         // Microsoft Visual C++ 6.0 or later
40                         #define SUPPORT_TCHAR_TYPE
41                 #endif
42                 #if _MSC_VER >= 1400
43                         // Microsoft Visual C++ 8.0 (2005) or later
44                         #define SUPPORT_SECURE_FUNCTIONS
45                         #pragma warning( disable : 4819 )
46                         //#pragma warning( disable : 4995 )
47                         #pragma warning( disable : 4996 )
48                 #endif
49                 #if _MSC_VER >= 1800
50                         // Microsoft Visual C++ 12.0 (2013) or later
51                         #define SUPPORT_CPLUSPLUS_11
52                 #endif
53                 #define CSP_OS_WINDOWS
54         #else
55                 // Win32, but not Microsoft Visual C++
56                 #define SUPPORT_TCHAR_TYPE
57 //              #define SUPPORT_SECURE_FUNCTIONS
58         #endif
59 #endif
60 #ifdef __GNUC__
61         #if defined(Q_OS_CYGWIN) 
62                 #define CSP_OS_GCC_CYGWIN
63                 #define CSP_OS_WINDOWS
64         #elif defined(Q_OS_WIN) || defined(__WIN32) || defined(__WIN64)
65                 #define CSP_OS_GCC_WINDOWS
66                 #define CSP_OS_WINDOWS
67                 #ifdef USE_SHARED_DLL
68                         #define DLL_PREFIX   __declspec(dllexport)
69                         #define DLL_PREFIX_I __declspec(dllimport)
70                 #endif
71         #else
72                 #define CSP_OS_GCC_GENERIC
73                 #define CSP_OS_GENERIC
74                 #define DLL_PREFIX
75                 #define DLL_PREFIX_I
76         #endif
77         #if defined(__clang__)
78                 #define __CSP_COMPILER_CLANG
79         #else
80                 #define __CSP_COMPILER_GCC
81         #endif
82         #define SUPPORT_CPLUSPLUS_11
83 #else
84                 #define DLL_PREFIX
85                 #define DLL_PREFIX_I
86 #endif
87
88 #ifndef SUPPORT_CPLUSPLUS_11
89         #if defined(__cplusplus) && (__cplusplus > 199711L)
90                 #define SUPPORT_CPLUSPLUS_11
91         #endif
92 #endif
93 #ifndef SUPPORT_TCHAR_TYPE
94         // secure functions need tchar type
95         #undef SUPPORT_SECURE_FUNCTIONS
96 #endif
97 #ifndef DLL_PREFIX
98         #define DLL_PREFIX
99 #endif
100 #ifndef DLL_PREFIX_I
101         #define DLL_PREFIX_I
102 #endif
103
104 // include common header files
105 #ifdef SUPPORT_TCHAR_TYPE
106         #include <tchar.h>
107 #endif
108 #ifdef SUPPORT_CPLUSPLUS_11
109         #include <stdint.h>
110 #endif
111 #include <stdio.h>
112 #include <stdlib.h>
113 #include <string.h>
114 #ifdef _MSC_VER
115 #include <typeinfo.h>
116 #else
117 #include <typeinfo>
118 #endif
119 #include <assert.h>
120 #include <errno.h>
121
122 // include environment/language dependent header files
123 #ifdef _WIN32
124         #include <windows.h>
125         #include <windowsx.h>
126         #include <winuser.h>
127         #include <mmsystem.h>
128         #include <process.h>
129 #endif
130 #ifdef __GNUC__
131         #include <stdarg.h>
132 #endif
133 #ifdef _USE_QT
134         #ifdef _USE_QT5
135                 #include <QString>
136                 #include <QFile>
137                 #include <QtEndian>
138                 #if defined(__MINGW32__) || (__MINGW64__)
139                         #include <windows.h>
140                         #include <winbase.h>
141                 #endif
142         #else
143                 #include <QtCore/QString>
144                 #include <QtCore/QFile>
145         #endif
146         #include <sys/param.h>
147 #endif
148 #ifndef _MAX_PATH
149         #define _MAX_PATH 2048
150 #endif
151
152 // endian
153 #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
154         #if defined(__BYTE_ORDER) && (defined(__LITTLE_ENDIAN) || defined(__BIG_ENDIAN))
155                 #if __BYTE_ORDER == __LITTLE_ENDIAN
156                         #define __LITTLE_ENDIAN__
157                 #elif __BYTE_ORDER == __BIG_ENDIAN
158                         #define __BIG_ENDIAN__
159                 #endif
160         #elif defined(SDL_BYTEORDER) && (defined(SDL_LIL_ENDIAN) || defined(SDL_BIG_ENDIAN))
161                 #if SDL_BYTEORDER == SDL_LIL_ENDIAN
162                         #define __LITTLE_ENDIAN__
163                 #elif SDL_BYTEORDER == SDL_BIG_ENDIAN
164                         #define __BIG_ENDIAN__
165                 #endif
166         #elif defined(WORDS_LITTLEENDIAN)
167                 #define __LITTLE_ENDIAN__
168         #elif defined(WORDS_BIGENDIAN)
169                 #define __BIG_ENDIAN__
170         #endif
171 #endif
172 #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
173         // may be Microsoft Visual C++
174         #define __LITTLE_ENDIAN__
175 #endif
176
177 // type definition
178 #ifndef SUPPORT_TCHAR_TYPE
179         #ifndef _TCHAR
180                 typedef char _TCHAR;
181         #endif
182 #endif
183
184 #ifndef SUPPORT_CPLUSPLUS_11
185         #ifndef int8_t
186                 typedef signed char int8_t;
187         #endif
188         #ifndef int16_t
189                 typedef signed short int16_t;
190         #endif
191         #ifndef int32_t
192                 typedef signed int int32_t;
193         #endif
194         #ifndef int64_t
195                 typedef signed long long int64_t;
196         #endif
197         #ifndef uint8_t
198                 typedef unsigned char uint8_t;
199         #endif
200         #ifndef uint16_t
201                 typedef unsigned short uint16_t;
202         #endif
203         #ifndef uint32_t
204                 typedef unsigned int uint32_t;
205         #endif
206         #ifndef uint64_t
207                 typedef unsigned long long uint64_t;
208         #endif
209 #endif
210
211 #ifndef _WIN32
212         #ifndef LPTSTR
213                 typedef _TCHAR* LPTSTR;
214         #endif
215         #ifndef LPCTSTR
216                 typedef const _TCHAR* LPCTSTR;
217         #endif
218         #ifndef BOOL
219                 typedef int BOOL;
220         #endif
221         #ifndef TRUE
222                 #define TRUE 1
223         #endif
224         #ifndef FALSE
225                 #define FALSE 0
226         #endif
227         #ifndef BYTE
228                 typedef uint8_t BYTE;
229         #endif
230         #ifndef WORD
231                 typedef uint16_t WORD;
232         #endif
233         #ifndef DWORD
234                 typedef uint32_t DWORD;
235         #endif
236         #ifndef QWORD
237                 typedef uint64_t QWORD;
238         #endif
239         #ifndef INT8
240                 typedef int8_t INT8;
241         #endif
242         #ifndef INT16
243                 typedef int16_t INT16;
244         #endif
245         #ifndef INT32
246                 typedef int32_t INT32;
247         #endif
248         #ifndef INT64
249                 typedef int64_t INT64;
250         #endif
251         #ifndef UINT8
252                 typedef uint8_t UINT8;
253         #endif
254         #ifndef UINT16
255                 typedef uint16_t UINT16;
256         #endif
257         #ifndef UINT32
258                 typedef uint32_t UINT32;
259         #endif
260         #ifndef UINT64
261                 typedef uint64_t UINT64;
262         #endif
263         #ifndef INT
264                 typedef int INT;
265         #endif
266         #ifndef UINT
267                 typedef unsigned int UINT;
268         #endif
269 #endif
270
271 typedef union {
272         struct {
273 #ifdef __BIG_ENDIAN__
274                 uint8_t h, l;
275 #else
276                 uint8_t l, h;
277 #endif
278         } b;
279         struct {
280 #ifdef __BIG_ENDIAN__
281                 int8_t h, l;
282 #else
283                 int8_t l, h;
284 #endif
285         } sb;
286         uint16_t w;
287         int16_t sw;
288
289         inline void read_2bytes_le_from(uint8_t *t)
290         {
291                 b.l = t[0]; b.h = t[1];
292         }
293         inline void write_2bytes_le_to(uint8_t *t)
294         {
295                 t[0] = b.l; t[1] = b.h;
296         }
297         inline void read_2bytes_be_from(uint8_t *t)
298         {
299                 b.h = t[0]; b.l = t[1];
300         }
301         inline void write_2bytes_be_to(uint8_t *t)
302         {
303                 t[0] = b.h; t[1] = b.l;
304         }
305         
306         inline void set_2bytes_be_from(uint16_t n)
307         {
308                 union {
309                         uint16_t w;
310                         struct {
311                                 uint8_t h, l;
312                         }b;
313                 } bigv;
314                 bigv.w = n;
315                 b.l = bigv.b.l; b.h = bigv.b.h;
316         }
317         inline void set_2bytes_le_from(uint16_t n)
318         {
319                 union {
320                         uint16_t w;
321                         struct {
322                                 uint8_t l, h;
323                         }b;
324                 } littlev;
325                 littlev.w = n;
326                 b.l = littlev.b.l; b.h = littlev.b.h;
327         }
328         inline uint16_t get_2bytes_be_to()
329         {
330                 union {
331                         uint16_t w;
332                         struct {
333                                 uint8_t h, l;
334                         }b;
335                 } bigv;
336                 bigv.b.l = b.l; bigv.b.h = b.h;
337                 return bigv.w;
338         }
339         inline uint16_t get_2bytes_le_to()
340         {
341                 union {
342                         uint16_t w;
343                         struct {
344                                 uint8_t l, h;
345                         }b;
346                 } littlev;
347                 littlev.b.l = b.l; littlev.b.h = b.h;
348                 return littlev.w;
349         }
350
351 } pair16_t;
352
353 typedef union {
354         struct {
355 #ifdef __BIG_ENDIAN__
356                 uint8_t h3, h2, h, l;
357 #else
358                 uint8_t l, h, h2, h3;
359 #endif
360         } b;
361         struct {
362 #ifdef __BIG_ENDIAN__
363                 int8_t h3, h2, h, l;
364 #else
365                 int8_t l, h, h2, h3;
366 #endif
367         } sb;
368         struct {
369 #ifdef __BIG_ENDIAN__
370                 uint16_t h, l;
371 #else
372                 uint16_t l, h;
373 #endif
374         } w;
375         struct {
376 #ifdef __BIG_ENDIAN__
377                 int16_t h, l;
378 #else
379                 int16_t l, h;
380 #endif
381         } sw;
382         struct {
383 #ifdef __BIG_ENDIAN__
384                 pair16_t h, l;
385 #else
386                 pair16_t l, h;
387 #endif
388         } p16;
389         uint32_t d;
390         int32_t sd;
391         inline void read_2bytes_le_from(uint8_t *t)
392         {
393                 b.l = t[0]; b.h = t[1]; b.h2 = b.h3 = 0;
394         }
395         inline void write_2bytes_le_to(uint8_t *t)
396         {
397                 t[0] = b.l; t[1] = b.h;
398         }
399         inline void read_2bytes_be_from(uint8_t *t)
400         {
401                 b.h3 = b.h2 = 0; b.h = t[0]; b.l = t[1];
402         }
403         inline void write_2bytes_be_to(uint8_t *t)
404         {
405                 t[0] = b.h; t[1] = b.l;
406         }
407         inline void read_4bytes_le_from(uint8_t *t)
408         {
409                 b.l = t[0]; b.h = t[1]; b.h2 = t[2]; b.h3 = t[3];
410         }
411         inline void write_4bytes_le_to(uint8_t *t)
412         {
413                 t[0] = b.l; t[1] = b.h; t[2] = b.h2; t[3] = b.h3;
414         }
415         inline void read_4bytes_be_from(uint8_t *t)
416         {
417                 b.h3 = t[0]; b.h2 = t[1]; b.h = t[2]; b.l = t[3];
418         }
419         inline void write_4bytes_be_to(uint8_t *t)
420         {
421                 t[0] = b.h3; t[1] = b.h2; t[2] = b.h; t[3] = b.l;
422         }
423
424         inline void set_2bytes_be_from(uint16_t n)
425         {
426                 union {
427                         uint16_t w;
428                         struct {
429                                 uint8_t h, l;
430                         }b;
431                 } bigv;
432                 bigv.w = n;
433                 b.l = bigv.b.l; b.h = bigv.b.h;
434                 b.h2 = 0; b.h3 = 0;
435         }
436         inline void set_2bytes_le_from(uint16_t n)
437         {
438                 union {
439                         uint16_t w;
440                         struct {
441                                 uint8_t l, h;
442                         }b;
443                 } littlev;
444                 littlev.w = n;
445                 b.l = littlev.b.l; b.h = littlev.b.h;
446                 b.h2 = 0; b.h3 = 0;
447         }
448         inline uint16_t get_2bytes_be_to()
449         {
450                 union {
451                         uint16_t w;
452                         struct {
453                                 uint8_t h, l;
454                         }b;
455                 } bigv;
456                 bigv.b.l = b.l; bigv.b.h = b.h;
457                 return bigv.w;
458         }
459         inline uint16_t get_2bytes_le_to()
460         {
461                 union {
462                         uint16_t w;
463                         struct {
464                                 uint8_t l, h;
465                         }b;
466                 } littlev;
467                 littlev.b.l = b.l; littlev.b.h = b.h;
468                 return littlev.w;
469         }
470         
471         inline void set_4bytes_be_from(uint32_t n)
472         {
473                 union {
474                         uint32_t dw;
475                         struct {
476                                 uint8_t h3, h2, h, l;
477                         }b;
478                 } bigv;
479                 bigv.dw = n;
480                 b.l = bigv.b.l; b.h = bigv.b.h; b.h2 = bigv.b.h2; b.h3 = bigv.b.h3;
481         }
482         inline void set_4bytes_le_from(uint32_t n)
483         {
484                 union {
485                         uint32_t dw;
486                         struct {
487                                 uint8_t l, h, h2, h3;
488                         }b;
489                 } littlev;
490                 littlev.dw = n;
491                 b.l = littlev.b.l; b.h = littlev.b.h; b.h2 = littlev.b.h2; b.h3 = littlev.b.h3;
492         }
493         inline uint32_t get_4bytes_be_to()
494         {
495                 union {
496                         uint32_t dw;
497                         struct {
498                                 uint8_t h3, h2, h, l;
499                         }b;
500                 } bigv;
501                 bigv.b.l = b.l; bigv.b.h = b.h; bigv.b.h2 = b.h2; bigv.b.h3 = b.h3;
502                 return bigv.dw;
503         }
504         inline uint32_t get_4bytes_le_to()
505         {
506                 union {
507                         uint32_t dw;
508                         struct {
509                                 uint8_t l, h, h2, h3;
510                         }b;
511                 } littlev;
512                 littlev.b.l = b.l; littlev.b.h = b.h; littlev.b.h2 = b.h2; littlev.b.h3 = b.h3;
513                 return littlev.dw;
514         }
515 } pair_t;
516
517
518 typedef union {
519         struct {
520 #ifdef __BIG_ENDIAN__
521                 uint8_t h7, h6, h5, h4, h3, h2, h, l;
522 #else
523                 uint8_t l, h, h2, h3, h4, h5, h6, h7;
524 #endif
525         } b;
526         struct {
527 #ifdef __BIG_ENDIAN__
528                 int8_t h7, h6, h5, h4, h3, h2, h, l;
529 #else
530                 int8_t l, h, h2, h3, h4, h5, h6, h7;
531 #endif
532         } sb;
533         struct {
534 #ifdef __BIG_ENDIAN__
535                 uint16_t h3, h2, h, l;
536 #else
537                 uint16_t l, h, h2, h3;
538 #endif
539         } w;
540         struct {
541 #ifdef __BIG_ENDIAN__
542                 int16_t h3, h2, h, l;
543 #else
544                 int16_t l, h, h2, h3;
545 #endif
546         } sw;
547         struct {
548 #ifdef __BIG_ENDIAN__
549                 pair16_t h3, h2, h, l;
550 #else
551                 pair16_t l, h, h2, h3;
552 #endif
553         } p16;
554         struct {
555 #ifdef __BIG_ENDIAN__
556                 uint32_t h, l;
557 #else
558                 uint32_t l, h;
559 #endif
560         } d;
561         struct {
562 #ifdef __BIG_ENDIAN__
563                 int32_t h, l;
564 #else
565                 int32_t l, h;
566 #endif
567         } sd;
568         struct {
569 #ifdef __BIG_ENDIAN__
570                 pair_t h, l;
571 #else
572                 pair_t l, h;
573 #endif
574         } p32;
575         uint64_t q;
576         int64_t sq;
577         
578         inline void read_2bytes_le_from(uint8_t *t)
579         {
580                 b.l = t[0]; b.h = t[1]; b.h2 = b.h3 = 0;
581                 b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0;
582         }
583         inline void write_2bytes_le_to(uint8_t *t)
584         {
585                 t[0] = b.l; t[1] = b.h;
586         }
587         inline void read_2bytes_be_from(uint8_t *t)
588         {
589                 b.h3 = b.h2 = 0; b.h = t[0]; b.l = t[1];
590                 b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0;
591         }
592         inline void write_2bytes_be_to(uint8_t *t)
593         {
594                 t[0] = b.h; t[1] = b.l;
595         }
596         inline void read_4bytes_le_from(uint8_t *t)
597         {
598                 b.l = t[0]; b.h = t[1]; b.h2 = t[2]; b.h3 = t[3];
599                 b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0;
600         }
601         inline void write_4bytes_le_to(uint8_t *t)
602         {
603                 t[0] = b.l; t[1] = b.h; t[2] = b.h2; t[3] = b.h3;
604         }
605         inline void read_4bytes_be_from(uint8_t *t)
606         {
607                 b.h3 = t[0]; b.h2 = t[1]; b.h = t[2]; b.l = t[3];
608                 b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0;
609         }
610         inline void write_4bytes_be_to(uint8_t *t)
611         {
612                 t[0] = b.h3; t[1] = b.h2; t[2] = b.h; t[3] = b.l;
613         }
614         
615         inline void read_8bytes_le_from(uint8_t *t)
616         {
617                 b.l = t[0];  b.h = t[1];  b.h2 = t[2]; b.h3 = t[3];
618                 b.h4 = t[4]; b.h5 = t[5]; b.h6 = t[6]; b.h7 = t[7];
619         }
620         inline void write_8bytes_le_to(uint8_t *t)
621         {
622                 t[0] = b.l;  t[1] = b.h;  t[2] = b.h2; t[3] = b.h3;
623                 t[4] = b.h4; t[5] = b.h5; t[6] = b.h6; t[7] = b.h7;
624         }
625         inline void read_8bytes_be_from(uint8_t *t)
626         {
627                 b.h7 = t[0]; b.h6 = t[1]; b.h5 = t[2]; b.h4 = t[3];
628                 b.h3 = t[4]; b.h2 = t[5]; b.h = t[6];  b.l = t[7];
629         }
630         inline void write_8bytes_be_to(uint8_t *t)
631         {
632                 t[0] = b.h7; t[1] = b.h6; t[2] = b.h5; t[3] = b.h4;
633                 t[4] = b.h3; t[5] = b.h2; t[6] = b.h;  t[7] = b.l;
634         }
635
636         inline void set_2bytes_be_from(uint16_t n)
637         {
638                 union {
639                         uint16_t w;
640                         struct {
641                                 uint8_t h, l;
642                         }b;
643                 } bigv;
644                 bigv.w = n;
645                 b.l = bigv.b.l; b.h = bigv.b.h;
646                 b.h2 = 0; b.h3 = 0;
647                 b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0;
648         }
649         inline void set_2bytes_le_from(uint16_t n)
650         {
651                 union {
652                         uint16_t w;
653                         struct {
654                                 uint8_t l, h;
655                         }b;
656                 } littlev;
657                 littlev.w = n;
658                 b.l = littlev.b.l; b.h = littlev.b.h;
659                 b.h2 = 0; b.h3 = 0;
660                 b.h4 = 0; b.h5 = 0; b.h6 = 0; b.h7 = 0;
661         }
662         inline uint16_t get_2bytes_be_to()
663         {
664                 union {
665                         uint16_t w;
666                         struct {
667                                 uint8_t h, l;
668                         }b;
669                 } bigv;
670                 bigv.b.l = b.l; bigv.b.h = b.h;
671                 return bigv.w;
672         }
673         inline uint16_t get_2bytes_le_to()
674         {
675                 union {
676                         uint16_t w;
677                         struct {
678                                 uint8_t l, h;
679                         }b;
680                 } littlev;
681                 littlev.b.l = b.l; littlev.b.h = b.h;
682                 return littlev.w;
683         }
684         
685         inline void set_4bytes_be_from(uint32_t n)
686         {
687                 union {
688                         uint32_t dw;
689                         struct {
690                                 uint8_t h3, h2, h, l;
691                         }b;
692                 } bigv;
693                 bigv.dw = n;
694                 b.l = bigv.b.l; b.h = bigv.b.h; b.h2 = bigv.b.h2; b.h3 = bigv.b.h3;
695                 b.h4 = 0;       b.h5 = 0;       b.h6 = 0;         b.h7 = 0;
696         }
697         inline void set_4bytes_le_from(uint32_t n)
698         {
699                 union {
700                         uint32_t dw;
701                         struct {
702                                 uint8_t l, h, h2, h3;
703                         }b;
704                 } littlev;
705                 littlev.dw = n;
706                 b.l = littlev.b.l; b.h = littlev.b.h; b.h2 = littlev.b.h2; b.h3 = littlev.b.h3;
707                 b.h4 = 0;          b.h5 = 0;          b.h6 = 0;            b.h7 = 0;
708         }
709         inline uint32_t get_4bytes_be_to()
710         {
711                 union {
712                         uint32_t dw;
713                         struct {
714                                 uint8_t h3, h2, h, l;
715                         }b;
716                 } bigv;
717                 bigv.b.l = b.l; bigv.b.h = b.h; bigv.b.h2 = b.h2; bigv.b.h3 = b.h3;
718                 return bigv.dw;
719         }
720         inline uint32_t get_4bytes_le_to()
721         {
722                 union {
723                         uint32_t dw;
724                         struct {
725                                 uint8_t l, h, h2, h3;
726                         }b;
727                 } littlev;
728                 littlev.b.l = b.l; littlev.b.h = b.h; littlev.b.h2 = b.h2; littlev.b.h3 = b.h3;
729                 return littlev.dw;
730         }
731
732         inline void set_8bytes_be_from(uint64_t n)
733         {
734                 union {
735                         uint64_t qw;
736                         struct {
737                                 uint8_t h7, h6, h5, h4, h3, h2, h, l;
738                         }b;
739                 } bigv;
740                 bigv.qw = n;
741                 b.l = bigv.b.l;   b.h = bigv.b.h;   b.h2 = bigv.b.h2; b.h3 = bigv.b.h3;
742                 b.h4 = bigv.b.h4; b.h5 = bigv.b.h5; b.h6 = bigv.b.h6; b.h7 = bigv.b.h7;
743         }
744         inline void set_8bytes_le_from(uint64_t n)
745         {
746                 union {
747                         uint64_t qw;
748                         struct {
749                                 uint8_t l, h, h2, h3, h4, h5, h6, h7;
750                         }b;
751                 } littlev;
752                 littlev.qw = n;
753                 b.l = littlev.b.l;   b.h = littlev.b.h;   b.h2 = littlev.b.h2; b.h3 = littlev.b.h3;
754                 b.h4 = littlev.b.h4; b.h5 = littlev.b.h5; b.h6 = littlev.b.h6; b.h7 = littlev.b.h7;
755         }
756         inline uint64_t get_8bytes_be_to()
757         {
758                 union {
759                         uint64_t qw;
760                         struct {
761                                 uint8_t h7, h6, h5, h4, h3, h2, h, l;
762                         }b;
763                 } bigv;
764                 bigv.b.l = b.l;   bigv.b.h = b.h;   bigv.b.h2 = b.h2; bigv.b.h3 = b.h3;
765                 bigv.b.h4 = b.h4; bigv.b.h5 = b.h5; bigv.b.h6 = b.h6; bigv.b.h7 = b.h7;
766                 return bigv.qw;
767         }
768         inline uint64_t get_8bytes_le_to()
769         {
770                 union {
771                         uint64_t qw;
772                         struct {
773                                 uint8_t l, h, h2, h3, h4, h5, h6, h7;
774                         }b;
775                 } littlev;
776                 littlev.b.l = b.l;   littlev.b.h = b.h;   littlev.b.h2 = b.h2; littlev.b.h3 = b.h3;
777                 littlev.b.h4 = b.h4; littlev.b.h5 = b.h5; littlev.b.h6 = b.h6; littlev.b.h7 = b.h7;
778                 return littlev.qw;
779         }
780
781 } pair64_t;
782
783 uint32_t DLL_PREFIX EndianToLittle_DWORD(uint32_t x);
784 uint16_t DLL_PREFIX EndianToLittle_WORD(uint16_t x);
785
786 // max/min
787 #ifndef _MSC_VER
788         #undef max
789         #undef min
790         int DLL_PREFIX max(int a, int b);
791         unsigned int DLL_PREFIX max(unsigned int a, unsigned int b);
792         int DLL_PREFIX min(int a, int b);
793         unsigned int DLL_PREFIX min(unsigned int a, unsigned int b);
794 #endif
795
796 // string
797 #if defined(__GNUC__) || defined(__CYGWIN__) || defined(Q_OS_CYGWIN)
798         #define stricmp(a,b) strcasecmp(a,b)
799         #define strnicmp(a,b,n) strncasecmp(a,b,n)
800 #endif
801
802 #ifndef SUPPORT_TCHAR_TYPE
803         #ifndef _fgetts
804                 #define _fgetts fgets
805         #endif
806         #ifndef _ftprintf
807                 #define _ftprintf printf
808         #endif
809         #ifndef _tfopen
810                 #define _tfopen fopen
811         #endif
812         #ifndef _tcscmp
813                 #define _tcscmp strcmp
814         #endif
815         #ifndef _tcscpy
816                 #define _tcscpy strcpy
817         #endif
818         #ifndef _tcsicmp
819                 #define _tcsicmp stricmp
820         #endif
821         #ifndef _tcslen
822                 #define _tcslen strlen
823         #endif
824         #ifndef _tcscat
825                 #define _tcscat strcat
826         #endif
827         #ifndef _tcsncat
828                 #define _tcsncat strncat
829         #endif
830         #ifndef _tcsncpy
831                 #define _tcsncpy strncpy
832         #endif
833         #ifndef _tcsncicmp
834                 #define _tcsncicmp strnicmp
835         #endif
836         #ifndef _tcschr
837                 #define _tcschr strchr
838         #endif
839         #ifndef _tcsrchr
840                 #define _tcsrchr strrchr
841         #endif
842         #ifndef _tcsstr
843                 #define _tcsstr strstr
844         #endif
845         #ifndef _tcstok
846                 #define _tcstok strtok
847         #endif
848         #ifndef _tstoi
849                 #define _tstoi atoi
850         #endif
851         #ifndef _tcstol
852                 #define _tcstol strtol
853         #endif
854         #ifndef _tcstoul
855                 #define _tcstoul strtoul
856         #endif
857         #ifndef _stprintf
858                 #define _stprintf sprintf
859         #endif
860         #ifndef _vstprintf
861                 #define _vstprintf vsprintf
862         #endif
863         #ifndef _taccess
864                 #define _taccess access
865         #endif
866         #ifndef _tremove
867                 #define _tremove remove
868         #endif
869         #ifndef _trename
870                 #define _trename rename
871         #endif
872         #define __T(x) x
873         #define _T(x) __T(x)
874         #define _TEXT(x) __T(x)
875 #endif
876
877 #ifndef SUPPORT_SECURE_FUNCTIONS
878         #ifndef errno_t
879                 typedef int errno_t;
880         #endif
881 //      errno_t DLL_PREFIX my_tfopen_s(FILE** pFile, const _TCHAR *filename, const _TCHAR *mode);
882         errno_t DLL_PREFIX my_tcscat_s(_TCHAR *strDestination, size_t numberOfElements, const _TCHAR *strSource);
883         errno_t DLL_PREFIX my_strcpy_s(char *strDestination, size_t numberOfElements, const char *strSource);
884         errno_t DLL_PREFIX my_tcscpy_s(_TCHAR *strDestination, size_t numberOfElements, const _TCHAR *strSource);
885         errno_t DLL_PREFIX my_strncpy_s(char *strDestination, size_t numberOfElements, const char *strSource, size_t count);
886         errno_t DLL_PREFIX my_tcsncpy_s(_TCHAR *strDestination, size_t numberOfElements, const _TCHAR *strSource, size_t count);
887         char * DLL_PREFIX my_strtok_s(char *strToken, const char *strDelimit, char **context);
888         _TCHAR *DLL_PREFIX my_tcstok_s(_TCHAR *strToken, const char *strDelimit, _TCHAR **context);
889         #define my_fprintf_s fprintf
890         #define my_ftprintf_s fprintf
891         int DLL_PREFIX my_sprintf_s(char *buffer, size_t sizeOfBuffer, const char *format, ...);
892         int DLL_PREFIX my_swprintf_s(wchar_t *buffer, size_t sizeOfBuffer, const wchar_t *format, ...);
893         int DLL_PREFIX my_stprintf_s(_TCHAR *buffer, size_t sizeOfBuffer, const _TCHAR *format, ...);
894         int DLL_PREFIX my_vsprintf_s(char *buffer, size_t numberOfElements, const char *format, va_list argptr);
895         int DLL_PREFIX my_vstprintf_s(_TCHAR *buffer, size_t numberOfElements, const _TCHAR *format, va_list argptr);
896 #else
897 //      #define my_tfopen_s _tfopen_s
898         #define my_tcscat_s _tcscat_s
899         #define my_strcpy_s strcpy_s
900         #define my_tcscpy_s _tcscpy_s
901         #define my_strncpy_s strncpy_s
902         #define my_tcsncpy_s _tcsncpy_s
903         #define my_strtok_s strtok_s
904         #define my_tcstok_s _tcstok_s
905         #define my_fprintf_s fprintf_s
906         #define my_ftprintf_s _ftprintf_s
907         #define my_sprintf_s sprintf_s
908         #define my_swprintf_s swprintf_s
909         #define my_stprintf_s _stprintf_s
910         #define my_vsprintf_s vsprintf_s
911         #define my_vstprintf_s _vstprintf_s
912 #endif
913
914 // memory
915 #ifndef _MSC_VER
916         void *DLL_PREFIX my_memcpy(void *dst, void *src, size_t len);
917 #else
918         #define my_memcpy memcpy
919 #endif
920
921 // hint for SIMD
922 #if defined(__clang__)
923         #define __DECL_VECTORIZED_LOOP   _Pragma("clang loop vectorize(enable) interleave(enable)")
924 #elif defined(__GNUC__)
925         #define __DECL_VECTORIZED_LOOP  _Pragma("GCC ivdep")
926 #else
927         #define __DECL_VECTORIZED_LOOP
928 #endif
929
930 // C99 math functions
931 #ifdef _MSC_VER
932         #define my_isfinite _finite
933         #define my_log2(v) (log((double)(v)) / log(2.0))
934 #else
935         #include <cmath>
936         #define my_isfinite std::isfinite
937         #define my_log2 log2
938 #endif
939
940 // win32 api
941 #ifndef _WIN32
942         BOOL MyWritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileName);
943         DWORD MyGetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName);
944         UINT MyGetPrivateProfileInt(LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault, LPCTSTR lpFileName);
945         // used only in winmain and win32 osd class
946 //      #define ZeroMemory(p,s) memset(p,0x00,s)
947 //      #define CopyMemory(t,f,s) memcpy(t,f,s)
948 #else
949         #define MyWritePrivateProfileString WritePrivateProfileString
950         #define MyGetPrivateProfileString GetPrivateProfileString
951         #define MyGetPrivateProfileInt GetPrivateProfileInt
952 #endif
953
954 // rgb color
955 #if !defined(_RGB555) && !defined(_RGB565) && !defined(_RGB888)
956         #define _RGB888
957 #endif
958
959 #if defined(_RGB555) || defined(_RGB565)
960         typedef uint16_t scrntype_t;
961         scrntype_t DLL_PREFIX RGB_COLOR(uint32_t r, uint32_t g, uint32_t b);
962         scrntype_t DLL_PREFIX RGBA_COLOR(uint32_t r, uint32_t g, uint32_t b, uint32_t a);
963         uint8_t DLL_PREFIX R_OF_COLOR(scrntype_t c);
964         uint8_t DLL_PREFIX G_OF_COLOR(scrntype_t c);
965         uint8_t DLL_PREFIX B_OF_COLOR(scrntype_t c);
966         uint8_t DLL_PREFIX A_OF_COLOR(scrntype_t c);
967 #elif defined(_RGB888)
968         typedef uint32_t scrntype_t;
969         #define RGB_COLOR(r, g, b)      (((uint32_t)(r) << 16) | ((uint32_t)(g) << 8) | ((uint32_t)(b) << 0))
970         #define RGBA_COLOR(r, g, b, a)  (((uint32_t)(r) << 16) | ((uint32_t)(g) << 8) | ((uint32_t)(b) << 0) | ((uint32_t)(a) << 24))
971         #define R_OF_COLOR(c)           (((c) >> 16) & 0xff)
972         #define G_OF_COLOR(c)           (((c) >>  8) & 0xff)
973         #define B_OF_COLOR(c)           (((c)      ) & 0xff)
974         #define A_OF_COLOR(c)           (((c) >> 24) & 0xff)
975 #endif
976
977 inline uint64_t ExchangeEndianU64(uint64_t __in)
978 {
979         pair64_t __i, __o;
980         __i.q = __in;
981         __o.b.h7  = __i.b.l;
982         __o.b.h6  = __i.b.h;
983         __o.b.h5  = __i.b.h2;
984         __o.b.h4  = __i.b.h3;
985         __o.b.h3  = __i.b.h4;
986         __o.b.h2  = __i.b.h5;
987         __o.b.h   = __i.b.h6;
988         __o.b.l   = __i.b.h7;
989         return __o.q;
990 }
991
992 inline int64_t ExchangeEndianS64(uint64_t __in)
993 {
994         pair64_t __i, __o;
995         __i.q = __in;
996         __o.b.h7  = __i.b.l;
997         __o.b.h6  = __i.b.h;
998         __o.b.h5  = __i.b.h2;
999         __o.b.h4  = __i.b.h3;
1000         __o.b.h3  = __i.b.h4;
1001         __o.b.h2  = __i.b.h5;
1002         __o.b.h   = __i.b.h6;
1003         __o.b.l   = __i.b.h7;
1004         return __o.sq;
1005 }
1006 inline uint32_t ExchangeEndianU32(uint32_t __in)
1007 {
1008         pair_t __i, __o;
1009         __i.d = __in;
1010         __o.b.h3 = __i.b.l;
1011         __o.b.h2 = __i.b.h;
1012         __o.b.h  = __i.b.h2;
1013         __o.b.l  = __i.b.h3;
1014         return __o.d;
1015 }
1016
1017 inline int32_t ExchangeEndianS32(uint32_t __in)
1018 {
1019         pair_t __i, __o;
1020         __i.d = __in;
1021         __o.b.h3 = __i.b.l;
1022         __o.b.h2 = __i.b.h;
1023         __o.b.h  = __i.b.h2;
1024         __o.b.l  = __i.b.h3;
1025         return __o.sd;
1026 }
1027
1028 inline uint16_t ExchangeEndianU16(uint16_t __in)
1029 {
1030         pair16_t __i, __o;
1031         __i.w = __in;
1032         __o.b.h = __i.b.l;
1033         __o.b.l  = __i.b.h;
1034         return __o.w;
1035 }
1036
1037 inline int16_t ExchangeEndianS16(uint16_t __in)
1038 {
1039         pair16_t __i, __o;
1040         __i.w = __in;
1041         __o.b.h = __i.b.l;
1042         __o.b.l = __i.b.h;
1043         return __o.sw;
1044 }
1045
1046 // wav file header
1047 #pragma pack(1)
1048 typedef struct {
1049         char id[4];
1050         uint32_t size;
1051 } wav_chunk_t;
1052 #pragma pack()
1053
1054 #pragma pack(1)
1055 typedef struct {
1056         wav_chunk_t riff_chunk;
1057         char wave[4];
1058         wav_chunk_t fmt_chunk;
1059         uint16_t format_id;
1060         uint16_t channels;
1061         uint32_t sample_rate;
1062         uint32_t data_speed;
1063         uint16_t block_size;
1064         uint16_t sample_bits;
1065 } wav_header_t;
1066 #pragma pack()
1067
1068 // file path
1069 const _TCHAR *DLL_PREFIX get_application_path();
1070 const _TCHAR *DLL_PREFIX create_local_path(const _TCHAR *format, ...);
1071 void DLL_PREFIX create_local_path(_TCHAR *file_path, int length, const _TCHAR *format, ...);
1072 const _TCHAR *DLL_PREFIX create_date_file_path(const _TCHAR *extension);
1073 bool DLL_PREFIX is_absolute_path(const _TCHAR *file_path);
1074 const _TCHAR *DLL_PREFIX create_absolute_path(const _TCHAR *file_name);
1075 void DLL_PREFIX create_absolute_path(_TCHAR *file_path, int length, const _TCHAR *file_name);
1076 void DLL_PREFIX create_date_file_path(_TCHAR *file_path, int length, const _TCHAR *extension);
1077 bool DLL_PREFIX check_file_extension(const _TCHAR *file_path, const _TCHAR *ext);
1078 const _TCHAR *DLL_PREFIX get_file_path_without_extensiton(const _TCHAR *file_path);
1079 void DLL_PREFIX get_long_full_path_name(const _TCHAR* src, _TCHAR* dst, size_t dst_len);
1080 const _TCHAR* DLL_PREFIX get_parent_dir(const _TCHAR* file);
1081
1082 // string
1083 const _TCHAR *DLL_PREFIX create_string(const _TCHAR* format, ...);
1084 const wchar_t *DLL_PREFIX char_to_wchar(const char *cs);
1085 const char *DLL_PREFIX wchar_to_char(const wchar_t *ws);
1086 const _TCHAR *DLL_PREFIX char_to_tchar(const char *cs);
1087 const char *DLL_PREFIX tchar_to_char(const _TCHAR *ts);
1088 const _TCHAR *DLL_PREFIX wchar_to_tchar(const wchar_t *ws);
1089 const wchar_t *DLL_PREFIX tchar_to_wchar(const _TCHAR *ts);
1090
1091
1092 // misc
1093 int32_t DLL_PREFIX muldiv_s32(int32_t nNumber, int32_t nNumerator, int32_t nDenominator);
1094 uint32_t DLL_PREFIX muldiv_u32(uint32_t nNumber, uint32_t nNumerator, uint32_t nDenominator);
1095
1096 uint32_t DLL_PREFIX get_crc32(uint8_t data[], int size);
1097 uint32_t DLL_PREFIX calc_crc32(uint32_t seed, uint8_t data[], int size);
1098 uint16_t DLL_PREFIX jis_to_sjis(uint16_t jis);
1099
1100 int DLL_PREFIX decibel_to_volume(int decibel);
1101 int32_t DLL_PREFIX apply_volume(int32_t sample, int volume);
1102
1103 #define array_length(array) (sizeof(array) / sizeof(array[0]))
1104
1105 #define FROM_BCD(v)     (((v) & 0x0f) + (((v) >> 4) & 0x0f) * 10)
1106 #define TO_BCD(v)       ((int)(((v) % 100) / 10) << 4) | ((v) % 10)
1107 #define TO_BCD_LO(v)    ((v) % 10)
1108 #define TO_BCD_HI(v)    (int)(((v) % 100) / 10)
1109
1110 // time
1111 #define LEAP_YEAR(y)    (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
1112
1113 #define dll_cur_time_t DLL_PREFIX_I struct cur_time_s
1114
1115 typedef DLL_PREFIX struct cur_time_s {
1116         int year, month, day, day_of_week, hour, minute, second;
1117         bool initialized;
1118         cur_time_s()
1119         {
1120                 initialized = false;
1121         }
1122         void increment();
1123         void update_year();
1124         void update_day_of_week();
1125         void save_state(void *f);
1126         bool load_state(void *f);
1127         void save_state_helper(void *f, uint32_t *sumseed, bool *__stat);
1128         bool load_state_helper(void *f, uint32_t *sumseed, bool *__stat);
1129 } cur_time_t;
1130
1131 void DLL_PREFIX get_host_time(cur_time_t* cur_time);
1132
1133 // symbol
1134 typedef struct symbol_s {
1135         uint32_t addr;
1136         _TCHAR *name;
1137         struct symbol_s *next_symbol;
1138 } symbol_t;
1139
1140 const _TCHAR* DLL_PREFIX get_symbol(symbol_t *first_symbol, uint32_t addr);
1141 const _TCHAR* DLL_PREFIX get_value_or_symbol(symbol_t *first_symbol, const _TCHAR *format, uint32_t addr);
1142 const _TCHAR* DLL_PREFIX get_value_and_symbol(symbol_t *first_symbol, const _TCHAR *format, uint32_t addr);
1143
1144 #endif