//----------------------------------------------------------------------------- // compat (unix & stdio.h) #if is(tcc) && is(win32) // add missing symbols const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT; /* :: */ const struct in6_addr in6addr_loopback; /* ::1 */ #endif #if is(win32) #include #if is(mingw) #include #endif #else #include #include // sched_setaffinity(), CPU_ZERO(), CPU_COUNT() #include #endif #if is(ems) //#define unlink(x) ((void)(x), 0) #endif #if is(win32) //#define alloca _alloca #define atoi64 _atoi64 #define popen _popen #define pclose _pclose //#define strncasecmp _strnicmp #define mkdir(p,m) mkdir(p) #define chdir ifdef(cl, _chdir, chdir) #if is(cl) || is(tcc) #define ftruncate _chsize_s #endif #else // gcc //#include // mingw64 does not have it #include // strncasecmp #define atoi64 atoll //#define strstri strcasestr //#define strcmpi strcasecmp #endif #if defined MAX_PATH #define DIR_MAX MAX_PATH #elif defined PATH_MAX #define DIR_MAX PATH_MAX #else #define DIR_MAX 260 #endif #if is(win32) // _MSC_VER and __MINGW64__ #include #include #include #include #include #include FILE *fmemopen(void *buf, size_t len, const char *type) { int fd = -1; char temppath[DIR_MAX - 14], filename[DIR_MAX + 1]; if( GetTempPathA(sizeof(temppath), temppath) ) if( GetTempFileNameA(temppath, "v4k_temp", 0, filename) ) if( !_sopen_s(&fd, filename, _O_CREAT | _O_SHORT_LIVED | _O_TEMPORARY | _O_RDWR | _O_BINARY | _O_NOINHERIT, _SH_DENYRW, _S_IREAD | _S_IWRITE) ) for( FILE *fp = fd != -1 ? _fdopen(fd, "w+b") : NULL; fp; ) return fwrite(buf, len, 1, fp), rewind(fp), unlink(filename), fp; // no need to _close. fclose(on the returned FILE*) also _closes the file descriptor. return fd != -1 ? _close(fd), NULL : NULL; } #endif #if 0 #if !is(cl) #define tmpfile file_temp #endif #define tmpnam(x) file_tempname() #endif #if 0 static const char *pathfile_from_handle(FILE *fp) { #if is(win32) int fd = fileno(fp); HANDLE handle = (HANDLE)_get_osfhandle( fd ); // DWORD size = GetFinalPathNameByHandleW(handle, NULL, 0, VOLUME_NAME_DOS); wchar_t name[DIR_MAX] = L""; size = GetFinalPathNameByHandleW(handle, name, size, VOLUME_NAME_DOS); name[size] = L'\0'; return wchar16to8(name + 4); // skip \\?\ header #else // In Linux, you can use readlink on /proc/self/fd/NNN where NNN is the file descriptor // In OSX: // #include // #include // char filePath[DIR_MAX]; // if (fcntl(fd, F_GETPATH, filePath) != -1) { // // do something with the file path // } return 0; #endif } #endif // ----------------------------------------------------------------------------- // new C macros #define cast(T) ifdef(c, void *, decltype(T)) #define literal(T) ifdef(c, T, (T)) // ----------------------------------------------------------------------------- void v4k_init(); static void v4k_pre_init(); static void v4k_post_init(float);