OSDN Git Service

[General][WIP] Merge upstream 2017-03-20.Still not implement UIs.
[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                 #define USE_ZLIB
22         #endif
23 #endif
24
25 // check environemnt/language
26 #ifdef _WIN32
27         #ifdef _MSC_VER
28                 // Microsoft Visual C++
29                 #if _MSC_VER == 1200
30                         // variable scope of 'for' loop for Microsoft Visual C++ 6.0
31                         #define for if(0);else for
32                 #endif
33                 #if _MSC_VER >= 1200
34                         // Microsoft Visual C++ 6.0 or later
35                         #define SUPPORT_TCHAR_TYPE
36                 #endif
37                 #if _MSC_VER >= 1400
38                         // Microsoft Visual C++ 8.0 (2005) or later
39                         #define SUPPORT_SECURE_FUNCTIONS
40                         #pragma warning( disable : 4819 )
41                         //#pragma warning( disable : 4995 )
42                         #pragma warning( disable : 4996 )
43                 #endif
44                 #if _MSC_VER >= 1800
45                         // Microsoft Visual C++ 12.0 (2013) or later
46                         #define SUPPORT_CPLUSPLUS_11
47                 #endif
48         #else
49                 // Win32, but not Microsoft Visual C++
50                 #define SUPPORT_TCHAR_TYPE
51 //              #define SUPPORT_SECURE_FUNCTIONS
52         #endif
53 #endif
54 #ifdef __GNUC__
55         #if defined(Q_OS_CYGWIN) 
56                 #define CSP_OS_GCC_CYGWIN
57                 #define CSP_OS_WINDOWS
58         #elif defined(Q_OS_WIN) || defined(__WIN32) || defined(__WIN64)
59                 #define CSP_OS_GCC_WINDOWS
60                 #define CSP_OS_WINDOWS
61                 #ifdef USE_SHARED_DLL
62                         #define DLL_PREFIX   __declspec(dllexport)
63                         #define DLL_PREFIX_I __declspec(dllimport)
64                 #endif
65         #else
66                 #define CSP_OS_GCC_GENERIC
67                 #define CSP_OS_GENERIC
68                 #define DLL_PREFIX
69                 #define DLL_PREFIX_I
70         #endif
71         #if defined(__clang__)
72                 #define __CSP_COMPILER_CLANG
73         #else
74                 #define __CSP_COMPILER_GCC
75         #endif
76         #define SUPPORT_CPLUSPLUS_11
77 #else
78                 #define DLL_PREFIX
79                 #define DLL_PREFIX_I
80 #endif
81
82 #ifndef SUPPORT_CPLUSPLUS_11
83         #if defined(__cplusplus) && (__cplusplus > 199711L)
84                 #define SUPPORT_CPLUSPLUS_11
85         #endif
86 #endif
87 #ifndef SUPPORT_TCHAR_TYPE
88         // secure functions need tchar type
89         #undef SUPPORT_SECURE_FUNCTIONS
90 #endif
91 #ifndef DLL_PREFIX
92         #define DLL_PREFIX
93 #endif
94 #ifndef DLL_PREFIX_I
95         #define DLL_PREFIX_I
96 #endif
97
98 // include common header files
99 #ifdef SUPPORT_TCHAR_TYPE
100         #include <tchar.h>
101 #endif
102 #ifdef SUPPORT_CPLUSPLUS_11
103         #include <stdint.h>
104 #endif
105 #include <stdio.h>
106 #include <stdlib.h>
107 #include <string.h>
108 #include <assert.h>
109 #include <errno.h>
110
111 // include environment/language dependent header files
112 #ifdef _WIN32
113         #include <windows.h>
114         #include <windowsx.h>
115         #include <winuser.h>
116         #include <mmsystem.h>
117         #include <process.h>
118 #endif
119 #ifdef __GNUC__
120         #include <stdarg.h>
121 #endif
122 #ifdef _USE_QT
123         #ifdef _USE_QT5
124                 #include <QString>
125                 #include <QFile>
126                 #include <QtEndian>
127                 #if defined(__MINGW32__) || (__MINGW64__)
128                         #include <windows.h>
129                         #include <winbase.h>
130                 #endif
131         #else
132                 #include <QtCore/QString>
133                 #include <QtCore/QFile>
134         #endif
135         #include <sys/param.h>
136 #endif
137 #ifndef _MAX_PATH
138         #define _MAX_PATH 2048
139 #endif
140
141 // endian
142 #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
143         #if defined(__BYTE_ORDER) && (defined(__LITTLE_ENDIAN) || defined(__BIG_ENDIAN))
144                 #if __BYTE_ORDER == __LITTLE_ENDIAN
145                         #define __LITTLE_ENDIAN__
146                 #elif __BYTE_ORDER == __BIG_ENDIAN
147                         #define __BIG_ENDIAN__
148                 #endif
149         #elif defined(SDL_BYTEORDER) && (defined(SDL_LIL_ENDIAN) || defined(SDL_BIG_ENDIAN))
150                 #if SDL_BYTEORDER == SDL_LIL_ENDIAN
151                         #define __LITTLE_ENDIAN__
152                 #elif SDL_BYTEORDER == SDL_BIG_ENDIAN
153                         #define __BIG_ENDIAN__
154                 #endif
155         #elif defined(WORDS_LITTLEENDIAN)
156                 #define __LITTLE_ENDIAN__
157         #elif defined(WORDS_BIGENDIAN)
158                 #define __BIG_ENDIAN__
159         #endif
160 #endif
161 #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
162         // may be Microsoft Visual C++
163         #define __LITTLE_ENDIAN__
164 #endif
165
166 // type definition
167 #ifndef SUPPORT_TCHAR_TYPE
168         #ifndef _TCHAR
169                 typedef char _TCHAR;
170         #endif
171 #endif
172
173 #ifndef SUPPORT_CPLUSPLUS_11
174         #ifndef int8_t
175                 typedef signed char int8_t;
176         #endif
177         #ifndef int16_t
178                 typedef signed short int16_t;
179         #endif
180         #ifndef int32_t
181                 typedef signed int int32_t;
182         #endif
183         #ifndef int64_t
184                 typedef signed long long int64_t;
185         #endif
186         #ifndef uint8_t
187                 typedef unsigned char uint8_t;
188         #endif
189         #ifndef uint16_t
190                 typedef unsigned short uint16_t;
191         #endif
192         #ifndef uint32_t
193                 typedef unsigned int uint32_t;
194         #endif
195         #ifndef uint64_t
196                 typedef unsigned long long uint64_t;
197         #endif
198 #endif
199
200 #ifndef _WIN32
201         #ifndef LPTSTR
202                 typedef _TCHAR* LPTSTR;
203         #endif
204         #ifndef LPCTSTR
205                 typedef const _TCHAR* LPCTSTR;
206         #endif
207         #ifndef BOOL
208                 typedef int BOOL;
209         #endif
210         #ifndef TRUE
211                 #define TRUE 1
212         #endif
213         #ifndef FALSE
214                 #define FALSE 0
215         #endif
216         #ifndef BYTE
217                 typedef uint8_t BYTE;
218         #endif
219         #ifndef WORD
220                 typedef uint16_t WORD;
221         #endif
222         #ifndef DWORD
223                 typedef uint32_t DWORD;
224         #endif
225         #ifndef QWORD
226                 typedef uint64_t QWORD;
227         #endif
228         #ifndef INT8
229                 typedef int8_t INT8;
230         #endif
231         #ifndef INT16
232                 typedef int16_t INT16;
233         #endif
234         #ifndef INT32
235                 typedef int32_t INT32;
236         #endif
237         #ifndef INT64
238                 typedef int64_t INT64;
239         #endif
240         #ifndef UINT8
241                 typedef uint8_t UINT8;
242         #endif
243         #ifndef UINT16
244                 typedef uint16_t UINT16;
245         #endif
246         #ifndef UINT32
247                 typedef uint32_t UINT32;
248         #endif
249         #ifndef UINT64
250                 typedef uint64_t UINT64;
251         #endif
252         #ifndef INT
253                 typedef int INT;
254         #endif
255         #ifndef UINT
256                 typedef unsigned int UINT;
257         #endif
258 #endif
259
260 typedef union {
261         struct {
262 #ifdef __BIG_ENDIAN__
263                 uint8_t h3, h2, h, l;
264 #else
265                 uint8_t l, h, h2, h3;
266 #endif
267         } b;
268         struct {
269 #ifdef __BIG_ENDIAN__
270                 int8_t h3, h2, h, l;
271 #else
272                 int8_t l, h, h2, h3;
273 #endif
274         } sb;
275         struct {
276 #ifdef __BIG_ENDIAN__
277                 uint16_t h, l;
278 #else
279                 uint16_t l, h;
280 #endif
281         } w;
282         struct {
283 #ifdef __BIG_ENDIAN__
284                 int16_t h, l;
285 #else
286                 int16_t l, h;
287 #endif
288         } sw;
289         uint32_t d;
290         int32_t sd;
291         inline void read_2bytes_le_from(uint8_t *t)
292         {
293                 b.l = t[0]; b.h = t[1]; b.h2 = b.h3 = 0;
294         }
295         inline void write_2bytes_le_to(uint8_t *t)
296         {
297                 t[0] = b.l; t[1] = b.h;
298         }
299         inline void read_2bytes_be_from(uint8_t *t)
300         {
301                 b.h3 = b.h2 = 0; b.h = t[0]; b.l = t[1];
302         }
303         inline void write_2bytes_be_to(uint8_t *t)
304         {
305                 t[0] = b.h; t[1] = b.l;
306         }
307         inline void read_4bytes_le_from(uint8_t *t)
308         {
309                 b.l = t[0]; b.h = t[1]; b.h2 = t[2]; b.h3 = t[3];
310         }
311         inline void write_4bytes_le_to(uint8_t *t)
312         {
313                 t[0] = b.l; t[1] = b.h; t[2] = b.h2; t[3] = b.h3;
314         }
315         inline void read_4bytes_be_from(uint8_t *t)
316         {
317                 b.h3 = t[0]; b.h2 = t[1]; b.h = t[2]; b.l = t[3];
318         }
319         inline void write_4bytes_be_to(uint8_t *t)
320         {
321                 t[0] = b.h3; t[1] = b.h2; t[2] = b.h; t[3] = b.l;
322         }
323 } pair_t;
324
325 uint32_t DLL_PREFIX EndianToLittle_DWORD(uint32_t x);
326 uint16_t DLL_PREFIX EndianToLittle_WORD(uint16_t x);
327
328 // max/min
329 #ifndef _MSC_VER
330         #undef max
331         #undef min
332         int max(int a, int b);
333         unsigned int max(unsigned int a, unsigned int b);
334         int min(int a, int b);
335         unsigned int min(unsigned int a, unsigned int b);
336 #endif
337
338 // string
339 #if defined(__GNUC__) || defined(__CYGWIN__) || defined(Q_OS_CYGWIN)
340         #define stricmp(a,b) strcasecmp(a,b)
341         #define strnicmp(a,b,n) strncasecmp(a,b,n)
342 #endif
343
344 #ifndef SUPPORT_TCHAR_TYPE
345         #ifndef _tfopen
346                 #define _tfopen fopen
347         #endif
348         #ifndef _tcscmp
349                 #define _tcscmp strcmp
350         #endif
351         #ifndef _tcscpy
352                 #define _tcscpy strcpy
353         #endif
354         #ifndef _tcsicmp
355                 #define _tcsicmp stricmp
356         #endif
357         #ifndef _tcslen
358                 #define _tcslen strlen
359         #endif
360         #ifndef _tcsncat
361                 #define _tcsncat strncat
362         #endif
363         #ifndef _tcsncpy
364                 #define _tcsncpy strncpy
365         #endif
366         #ifndef _tcsncicmp
367                 #define _tcsncicmp strnicmp
368         #endif
369         #ifndef _tcschr
370                 #define _tcschr strchr
371         #endif
372         #ifndef _tcsrchr
373                 #define _tcsrchr strrchr
374         #endif
375         #ifndef _tcsstr
376                 #define _tcsstr strstr
377         #endif
378         #ifndef _tcstok
379                 #define _tcstok strtok
380         #endif
381         #ifndef _tstoi
382                 #define _tstoi atoi
383         #endif
384         #ifndef _tcstol
385                 #define _tcstol strtol
386         #endif
387         #ifndef _tcstoul
388                 #define _tcstoul strtoul
389         #endif
390         #ifndef _stprintf
391                 #define _stprintf sprintf
392         #endif
393         #ifndef _vstprintf
394                 #define _vstprintf vsprintf
395         #endif
396         #ifndef _taccess
397                 #define _taccess access
398         #endif
399         #ifndef _tremove
400                 #define _tremove remove
401         #endif
402         #ifndef _trename
403                 #define _trename rename
404         #endif
405         #define __T(x) x
406         #define _T(x) __T(x)
407         #define _TEXT(x) __T(x)
408 #endif
409
410 #ifndef SUPPORT_SECURE_FUNCTIONS
411         #ifndef errno_t
412                 typedef int errno_t;
413         #endif
414 //      errno_t DLL_PREFIX my_tfopen_s(FILE** pFile, const _TCHAR *filename, const _TCHAR *mode);
415         errno_t DLL_PREFIX my_strcpy_s(char *strDestination, size_t numberOfElements, const char *strSource);
416         errno_t DLL_PREFIX my_tcscpy_s(_TCHAR *strDestination, size_t numberOfElements, const _TCHAR *strSource);
417         errno_t DLL_PREFIX my_strncpy_s(char *strDestination, size_t numberOfElements, const char *strSource, size_t count);
418         errno_t DLL_PREFIX my_tcsncpy_s(_TCHAR *strDestination, size_t numberOfElements, const _TCHAR *strSource, size_t count);
419         char * DLL_PREFIX my_strtok_s(char *strToken, const char *strDelimit, char **context);
420         _TCHAR * DLL_PREFIX my_tcstok_s(_TCHAR *strToken, const char *strDelimit, _TCHAR **context);
421         #define my_fprintf_s fprintf
422         int DLL_PREFIX my_sprintf_s(char *buffer, size_t sizeOfBuffer, const char *format, ...);
423         int DLL_PREFIX my_stprintf_s(_TCHAR *buffer, size_t sizeOfBuffer, const _TCHAR *format, ...);
424         int DLL_PREFIX my_vsprintf_s(char *buffer, size_t numberOfElements, const char *format, va_list argptr);
425         int DLL_PREFIX my_vstprintf_s(_TCHAR *buffer, size_t numberOfElements, const _TCHAR *format, va_list argptr);
426 #else
427 //      #define my_tfopen_s _tfopen_s
428         #define my_strcpy_s strcpy_s
429         #define my_tcscpy_s _tcscpy_s
430         #define my_strncpy_s strncpy_s
431         #define my_tcsncpy_s _tcsncpy_s
432         #define my_strtok_s strtok_s
433         #define my_tcstok_s _tcstok_s
434         #define my_fprintf_s fprintf_s
435         #define my_sprintf_s sprintf_s
436         #define my_stprintf_s _stprintf_s
437         #define my_vsprintf_s vsprintf_s
438         #define my_vstprintf_s _vstprintf_s
439 #endif
440
441 // win32 api
442 #ifndef _WIN32
443         BOOL MyWritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileName);
444         DWORD MyGetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName);
445         UINT MyGetPrivateProfileInt(LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault, LPCTSTR lpFileName);
446         // used only in winmain and win32 osd class
447 //      #define ZeroMemory(p,s) memset(p,0x00,s)
448 //      #define CopyMemory(t,f,s) memcpy(t,f,s)
449 #else
450         #define MyWritePrivateProfileString WritePrivateProfileString
451         #define MyGetPrivateProfileString GetPrivateProfileString
452         #define MyGetPrivateProfileInt GetPrivateProfileInt
453 #endif
454
455 // rgb color
456 #if !defined(_RGB555) && !defined(_RGB565) && !defined(_RGB888)
457         #define _RGB888
458 #endif
459
460 #if defined(_RGB555) || defined(_RGB565)
461         typedef uint16_t scrntype_t;
462         scrntype_t RGB_COLOR(uint32_t r, uint32_t g, uint32_t b);
463         scrntype_t RGBA_COLOR(uint32_t r, uint32_t g, uint32_t b, uint32_t a);
464         uint8_t R_OF_COLOR(scrntype_t c);
465         uint8_t G_OF_COLOR(scrntype_t c);
466         uint8_t B_OF_COLOR(scrntype_t c);
467         uint8_t A_OF_COLOR(scrntype_t c);
468 #elif defined(_RGB888)
469         typedef uint32_t scrntype_t;
470         #define RGB_COLOR(r, g, b)      (((uint32_t)(r) << 16) | ((uint32_t)(g) << 8) | ((uint32_t)(b) << 0))
471         #define RGBA_COLOR(r, g, b, a)  (((uint32_t)(r) << 16) | ((uint32_t)(g) << 8) | ((uint32_t)(b) << 0) | ((uint32_t)(a) << 24))
472         #define R_OF_COLOR(c)           (((c) >> 16) & 0xff)
473         #define G_OF_COLOR(c)           (((c) >>  8) & 0xff)
474         #define B_OF_COLOR(c)           (((c)      ) & 0xff)
475         #define A_OF_COLOR(c)           (((c) >> 24) & 0xff)
476 #endif
477
478 // wav file header
479 #pragma pack(1)
480 typedef struct {
481         char id[4];
482         uint32_t size;
483 } wav_chunk_t;
484 #pragma pack()
485
486 #pragma pack(1)
487 typedef struct {
488         wav_chunk_t riff_chunk;
489         char wave[4];
490         wav_chunk_t fmt_chunk;
491         uint16_t format_id;
492         uint16_t channels;
493         uint32_t sample_rate;
494         uint32_t data_speed;
495         uint16_t block_size;
496         uint16_t sample_bits;
497 } wav_header_t;
498 #pragma pack()
499
500 // file path
501 const _TCHAR *get_application_path();
502 const _TCHAR *create_local_path(const _TCHAR *format, ...);
503 void create_local_path(_TCHAR *file_path, int length, const _TCHAR *format, ...);
504 const _TCHAR *create_date_file_path(const _TCHAR *extension);
505 void create_date_file_path(_TCHAR *file_path, int length, const _TCHAR *extension);
506 bool check_file_extension(const _TCHAR *file_path, const _TCHAR *ext);
507 const _TCHAR *get_file_path_without_extensiton(const _TCHAR *file_path);
508 void get_long_full_path_name(const _TCHAR* src, _TCHAR* dst, size_t dst_len);
509 const _TCHAR* get_parent_dir(const _TCHAR* file);
510
511 // misc
512 const _TCHAR * DLL_PREFIX create_string(const _TCHAR* format, ...);
513 uint32_t DLL_PREFIX get_crc32(uint8_t data[], int size);
514 uint16_t DLL_PREFIX jis_to_sjis(uint16_t jis);
515
516 int DLL_PREFIX decibel_to_volume(int decibel);
517 int32_t DLL_PREFIX apply_volume(int32_t sample, int volume);
518
519 #define array_length(array) (sizeof(array) / sizeof(array[0]))
520
521 #define FROM_BCD(v)     (((v) & 0x0f) + (((v) >> 4) & 0x0f) * 10)
522 #define TO_BCD(v)       ((int)(((v) % 100) / 10) << 4) | ((v) % 10)
523 #define TO_BCD_LO(v)    ((v) % 10)
524 #define TO_BCD_HI(v)    (int)(((v) % 100) / 10)
525
526 #define LEAP_YEAR(y)    (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
527
528 #define dll_cur_time_t DLL_PREFIX_I struct cur_time_s
529
530 typedef DLL_PREFIX struct cur_time_s {
531         int year, month, day, day_of_week, hour, minute, second;
532         bool initialized;
533         cur_time_s()
534         {
535                 initialized = false;
536         }
537         void increment();
538         void update_year();
539         void update_day_of_week();
540         void save_state(void *f);
541         bool load_state(void *f);
542 } cur_time_t;
543
544 void DLL_PREFIX get_host_time(cur_time_t* cur_time);
545
546 #endif