Skip to content

Commit

Permalink
[Ref] mpt/main/main.hpp: Add main library that abstracts away platfor…
Browse files Browse the repository at this point in the history
…m-specific non-standard handling of main(), like Win32 wmain, MinGW missing prototypes, and DJGPP crt0 flags.

git-svn-id: https://source.openmpt.org/svn/openmpt/trunk/OpenMPT@21699 56274372-70c3-4bfc-bfc3-4c3a0b034d27
  • Loading branch information
manxorist committed Sep 23, 2024
1 parent 1f478de commit f40d9a0
Show file tree
Hide file tree
Showing 12 changed files with 221 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -1835,6 +1835,7 @@ bin/$(FLAVOUR_DIR)dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION).makefile.tar: b
svn export ./src/mpt/io_write bin/$(FLAVOUR_DIR)dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/io_write
#svn export ./src/mpt/json bin/$(FLAVOUR_DIR)dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/json
#svn export ./src/mpt/library bin/$(FLAVOUR_DIR)dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/library
svn export ./src/mpt/main bin/$(FLAVOUR_DIR)dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/main
svn export ./src/mpt/mutex bin/$(FLAVOUR_DIR)dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/mutex
svn export ./src/mpt/out_of_memory bin/$(FLAVOUR_DIR)dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/out_of_memory
svn export ./src/mpt/osinfo bin/$(FLAVOUR_DIR)dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/osinfo
Expand Down Expand Up @@ -1935,6 +1936,7 @@ bin/$(FLAVOUR_DIR)dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION).msvc.zip: bin/$
svn export ./src/mpt/io_write bin/$(FLAVOUR_DIR)dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/io_write --native-eol CRLF
#svn export ./src/mpt/json bin/$(FLAVOUR_DIR)dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/json --native-eol CRLF
#svn export ./src/mpt/library bin/$(FLAVOUR_DIR)dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/library --native-eol CRLF
svn export ./src/mpt/main bin/$(FLAVOUR_DIR)dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/main --native-eol CRLF
svn export ./src/mpt/mutex bin/$(FLAVOUR_DIR)dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/mutex --native-eol CRLF
svn export ./src/mpt/out_of_memory bin/$(FLAVOUR_DIR)dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/out_of_memory --native-eol CRLF
svn export ./src/mpt/osinfo bin/$(FLAVOUR_DIR)dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/osinfo --native-eol CRLF
Expand Down
1 change: 1 addition & 0 deletions build/autotools/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ MPT_FILES_SRC_MPT += src/mpt/io_read/filereader.hpp
MPT_FILES_SRC_MPT += src/mpt/io_write/buffer.hpp
#MPT_FILES_SRC_MPT += src/mpt/json/json.hpp
#MPT_FILES_SRC_MPT += src/mpt/library/library.hpp
MPT_FILES_SRC_MPT += src/mpt/main/main.hpp
MPT_FILES_SRC_MPT += src/mpt/mutex/mutex.hpp
MPT_FILES_SRC_MPT += src/mpt/osinfo/class.hpp
MPT_FILES_SRC_MPT += src/mpt/osinfo/dos_memory.hpp
Expand Down
2 changes: 2 additions & 0 deletions build/autotools/autoconfiscate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ svn export ./src/mpt/io_read bin/dist-autotools/src/mpt
svn export ./src/mpt/io_write bin/dist-autotools/src/mpt/io_write
#svn export ./src/mpt/json bin/dist-autotools/src/mpt/json
#svn export ./src/mpt/library bin/dist-autotools/src/mpt/library
svn export ./src/mpt/main bin/dist-autotools/src/mpt/main
svn export ./src/mpt/mutex bin/dist-autotools/src/mpt/mutex
svn export ./src/mpt/out_of_memory bin/dist-autotools/src/mpt/out_of_memory
svn export ./src/mpt/osinfo bin/dist-autotools/src/mpt/osinfo
Expand Down Expand Up @@ -164,6 +165,7 @@ cp -r ./src/mpt/io_read bin/dist-autotools/src/mpt
cp -r ./src/mpt/io_write bin/dist-autotools/src/mpt/io_write
#cp -r ./src/mpt/json bin/dist-autotools/src/mpt/json
#cp -r ./src/mpt/library bin/dist-autotools/src/mpt/library
cp -r ./src/mpt/main bin/dist-autotools/src/mpt/main
cp -r ./src/mpt/mutex bin/dist-autotools/src/mpt/mutex
cp -r ./src/mpt/out_of_memory bin/dist-autotools/src/mpt/out_of_memory
cp -r ./src/mpt/osinfo bin/dist-autotools/src/mpt/osinfo
Expand Down
2 changes: 2 additions & 0 deletions build/premake-xcode/mpt-libopenmpt.lua
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@
"../../src/mpt/json/**.hpp",
"../../src/mpt/library/**.cpp",
"../../src/mpt/library/**.hpp",
"../../src/mpt/main/**.cpp",
"../../src/mpt/main/**.hpp",
"../../src/mpt/test/**.cpp",
"../../src/mpt/test/**.hpp",
"../../src/mpt/uuid_namespace/**.cpp",
Expand Down
2 changes: 2 additions & 0 deletions build/premake/mpt-OpenMPT-NativeSupport.lua
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
}
excludes {
"../../mptrack/wine/WineWrapper.cpp",
"../../src/mpt/main/**.cpp",
"../../src/mpt/main/**.hpp",
"../../src/openmpt/fileformat_base/**.cpp",
"../../src/openmpt/fileformat_base/**.hpp",
"../../src/openmpt/soundfile_data/**.cpp",
Expand Down
4 changes: 4 additions & 0 deletions build/premake/mpt-OpenMPT.lua
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,10 @@ end
"../../pluginBridge/BridgeWrapper.cpp",
"../../pluginBridge/BridgeWrapper.h",
}
excludes {
"../../src/mpt/main/**.cpp",
"../../src/mpt/main/**.hpp",
}
files {
"../../mptrack/mptrack.rc",
"../../mptrack/res/*.*", -- resource data files
Expand Down
4 changes: 4 additions & 0 deletions build/premake/mpt-PluginBridge.lua
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
"../../common/versionNumber.h",
}
excludes {
"../../src/mpt/main/**.cpp",
"../../src/mpt/main/**.hpp",
"../../src/openmpt/fileformat_base/**.cpp",
"../../src/openmpt/fileformat_base/**.hpp",
"../../src/openmpt/soundbase/**.cpp",
Expand Down Expand Up @@ -83,6 +85,8 @@
"../../common/versionNumber.h",
}
excludes {
"../../src/mpt/main/**.cpp",
"../../src/mpt/main/**.hpp",
"../../src/openmpt/fileformat_base/**.cpp",
"../../src/openmpt/fileformat_base/**.hpp",
"../../src/openmpt/soundbase/**.cpp",
Expand Down
2 changes: 2 additions & 0 deletions build/premake/mpt-libopenmpt-small.lua
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@
"../../src/mpt/json/**.hpp",
"../../src/mpt/library/**.cpp",
"../../src/mpt/library/**.hpp",
"../../src/mpt/main/**.cpp",
"../../src/mpt/main/**.hpp",
"../../src/mpt/test/**.cpp",
"../../src/mpt/test/**.hpp",
"../../src/mpt/uuid_namespace/**.cpp",
Expand Down
2 changes: 2 additions & 0 deletions build/premake/mpt-libopenmpt.lua
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@
"../../src/mpt/json/**.hpp",
"../../src/mpt/library/**.cpp",
"../../src/mpt/library/**.hpp",
"../../src/mpt/main/**.cpp",
"../../src/mpt/main/**.hpp",
"../../src/mpt/test/**.cpp",
"../../src/mpt/test/**.hpp",
"../../src/mpt/uuid_namespace/**.cpp",
Expand Down
2 changes: 2 additions & 0 deletions build/premake/mpt-libopenmpt_test.lua
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@
"../../src/mpt/json/**.hpp",
"../../src/mpt/library/**.cpp",
"../../src/mpt/library/**.hpp",
"../../src/mpt/main/**.cpp",
"../../src/mpt/main/**.hpp",
"../../src/mpt/uuid_namespace/**.cpp",
"../../src/mpt/uuid_namespace/**.hpp",
"../../test/mpt_tests_crypto.cpp",
Expand Down
2 changes: 2 additions & 0 deletions build/premake/mpt-updatesigntool.lua
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
"../../installer/updatesigntool/*.h",
}
excludes {
"../../src/mpt/main/**.cpp",
"../../src/mpt/main/**.hpp",
"../../src/openmpt/fileformat_base/**.cpp",
"../../src/openmpt/fileformat_base/**.hpp",
"../../src/openmpt/soundbase/**.cpp",
Expand Down
196 changes: 196 additions & 0 deletions src/mpt/main/main.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */

#ifndef MPT_MAIN_MAIN_HPP
#define MPT_MAIN_MAIN_HPP



#include "mpt/base/check_platform.hpp"
#include "mpt/base/detect.hpp"
#include "mpt/base/integer.hpp"
#include "mpt/base/macros.hpp"
#include "mpt/base/namespace.hpp"
#include "mpt/string/types.hpp"
#include "mpt/string_transcode/transcode.hpp"

#include <type_traits>
#include <vector>

#if MPT_OS_DJGPP
#include <cassert>
#endif // MPT_OS_DJGPP

#if MPT_OS_DJGPP
#include <crt0.h>
#endif // MPT_OS_DJGPP

#if MPT_OS_WINDOWS
#include <windows.h>
#endif // MPT_OS_WINDOWS



namespace mpt {
inline namespace MPT_INLINE_NS {



namespace main {



#if MPT_OS_DJGPP
/* Work-around <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=45977> */
/* clang-format off */
#define MPT_MAIN_PREFIX \
extern "C" { \
int _crt0_startup_flags = 0 \
| _CRT0_FLAG_NONMOVE_SBRK /* force interrupt compatible allocation */ \
| _CRT0_DISABLE_SBRK_ADDRESS_WRAP /* force NT compatible allocation */ \
| _CRT0_FLAG_LOCK_MEMORY /* lock all code and data at program startup */ \
| 0; \
} \
/* clang-format on */
#endif /* MPT_OS_DJGPP */

#if !defined(MPT_MAIN_PREFIX)
#define MPT_MAIN_PREFIX
#endif



#if MPT_OS_WINDOWS && defined(UNICODE)
#define MPT_MAIN_NAME wmain
#elif defined(MPT_OS_WINDOWS)
#define MPT_MAIN_NAME main
#endif

#if !defined(MPT_MAIN_NAME)
#define MPT_MAIN_NAME main
#endif



#if MPT_OS_WINDOWS && defined(UNICODE)
#define MPT_MAIN_ARGV_TYPE wchar_t
#elif defined(MPT_OS_WINDOWS)
#define MPT_MAIN_ARGV_TYPE char
#endif

#if !defined(MPT_MAIN_NAME)
#define MPT_MAIN_ARGV_TYPE char
#endif



#if MPT_OS_WINDOWS && (MPT_COMPILER_GCC || MPT_COMPILER_CLANG)
#if defined(UNICODE)
#define MPT_MAIN_DECL extern "C" int wmain(int argc, wchar_t * argv[]);
#endif
#endif

#if !defined(MPT_MAIN_DECL)
#define MPT_MAIN_DECL
#endif



#if MPT_OS_DJGPP
/* clang-format off */
#define MPT_MAIN_PROLOG() \
do { \
_crt0_startup_flags &= ~_CRT0_FLAG_LOCK_MEMORY; \
assert(mpt::platform::libc().is_ok()); \
} while (0) \
/**/
/* clang-format on */
#endif // MPT_OS_DJGPP

#if !defined(MPT_MAIN_PROLOG)
#define MPT_MAIN_PROLOG() do { } while(0)
#endif



#if MPT_OS_WINDOWS && (MPT_COMPILER_GCC || MPT_COMPILER_CLANG)
#if defined(UNICODE)
#define MPT_MAIN_DEF_PREFIX extern "C"
#endif
#endif // MPT_OS_WINDOWS && (MPT_COMPILER_GCC || MPT_COMPILER_CLANG)

#if !defined(MPT_MAIN_DEF_PREFIX)
#define MPT_MAIN_DEF_PREFIX
#endif



inline mpt::ustring transcode_arg(char * arg) {
return mpt::transcode<mpt::ustring>(mpt::logical_encoding::locale, arg);
}

#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
inline mpt::ustring transcode_arg(wchar_t * arg) {
return mpt::transcode<mpt::ustring>(arg);
}
#endif

template <typename Tchar>
inline std::vector<mpt::ustring> transcode_argv(int argc, Tchar * argv[]) {
std::vector<mpt::ustring> args;
args.reserve(argc);
for (int arg = 0; arg < argc; ++arg) {
args.push_back(transcode_arg(argv[arg]));
}
return args;
}



#if !defined(MPT_MAIN_POSTFIX)
#define MPT_MAIN_POSTFIX
#endif



/* clang-format off */
#define MPT_MAIN_IMPLEMENT_MAIN(ns) \
MPT_MAIN_PREFIX \
MPT_MAIN_DECL \
MPT_MAIN_DEF_PREFIX int MPT_MAIN_NAME(int argc, MPT_MAIN_ARGV_TYPE * argv[]) { \
MPT_MAIN_PROLOG(); \
static_assert(std::is_same<decltype(ns::main), mpt::uint8(std::vector<mpt::ustring>)>::value); \
return static_cast<int>(ns::main(mpt::main::transcode_argv(argc, argv))); \
} \
MPT_MAIN_POSTFIX \
/**/
/* clang-format on */



/* clang-format off */
#define MPT_MAIN_IMPLEMENT_MAIN_NO_ARGS(ns) \
MPT_MAIN_PREFIX \
MPT_MAIN_DECL \
MPT_MAIN_DEF_PREFIX int MPT_MAIN_NAME(int argc, MPT_MAIN_ARGV_TYPE * argv[]) { \
MPT_MAIN_PROLOG(); \
static_assert(std::is_same<decltype(ns::main), mpt::uint8(void); \
MPT_UNUSED(argc); \
MPT_UNUSED(argv); \
return static_cast<int>(ns::main()); \
} \
MPT_MAIN_POSTFIX \
/**/
/* clang-format on */



} // namespace main



} // namespace MPT_INLINE_NS
} // namespace mpt



#endif // MPT_MAIN_MAIN_HPP

0 comments on commit f40d9a0

Please sign in to comment.