Banjo API 0.0.1
Multi-purpose C99 API
Loading...
Searching...
No Matches
main.h
1#pragma once
2
3#include <banjo/api.h>
4
5// Provided by the user to say that the client application is
6// provided its own main implementation.
7// #define BJ_NO_AUTOMAIN 1
8
9// Provided by the user to say that the client wants to use the
10// callback system.
11// #define BJ_AUTOMAIN_CALLBACKS
12
13// Defined internally to say that BJ will rename main() to bj_main
14// in order to provide a special main.
15// #define BJ_AUTOMAIN
16
17
18// Determining if main function is provided, optionnaly or not
19#ifndef BJ_NO_AUTOMAIN
20# if defined(BJ_OS_EMSCRIPTEN)
21# define BJ_AUTOMAIN
22# elif defined(BJ_OS_WINDOWS)
23# define BJ_AUTOMAIN
24# elif defined(BJ_OS_IOS)
25# define BJ_AUTOMAIN
26# endif
27#endif
28
29// // Rename user's main function
30// #if defined(BJ_AUTOMAIN) || defined(BJ_AUTOMAIN_CALLBACKS)
31// # define main bj_main
32// #endif
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38#if defined(BJ_AUTOMAIN) || defined(BJ_AUTOMAIN_CALLBACKS)
39extern int bj_main(int argc, char* argv[]);
40extern int bj_call_main(int argc, char* argv[], int (*function)(int argc, char* argv[]));
41#endif
42
43#ifdef BJ_AUTOMAIN_CALLBACKS
44
45typedef enum bj_callback_result_t
46{
47 bj_callback_exit_error = -1,
48 bj_callback_exit_success = 0,
49 bj_callback_continue = 1,
50} bj_callback_result;
51
52typedef int (*bj_app_begin_fn_t)(void**, int, char*[]);
53typedef int (*bj_app_iterate_fn_t)(void*);
54typedef int (*bj_app_end_fn_t)(void*, int);
55
56extern int bj_app_begin(void** user_data, int argc, char *argv[]);
57extern int bj_app_iterate(void* user_data);
58extern int bj_app_end(void* user_data, int status);
59
60extern int bj_call_main_callbacks(int argc, char* argv[], bj_app_begin_fn_t, bj_app_iterate_fn_t, bj_app_end_fn_t);
61
62#endif
63
64
65#ifdef __cplusplus
66}
67#endif
68
69#if !defined(BJ_NO_AUTOMAIN) && !defined(BJ_MAIN_NOIMPL)
70 #if defined(BJ_AUTOMAIN_CALLBACKS) || defined(BJ_AUTOMAIN)
71# ifdef main
72# undef main
73# endif
74# ifdef BJ_AUTOMAIN_CALLBACKS
75# define BJ_MAIN_CALLBACK_STANDARD 1
76 int bj_main(int argc, char* argv[]) {
77 return bj_call_main_callbacks(argc, argv, bj_app_begin, bj_app_iterate, bj_app_end);
78 }
79# endif
80# if (!defined(BJ_AUTOMAIN_CALLBACKS) || defined(BJ_MAIN_CALLBACK_STANDARD))
81# if defined(BJ_OS_WINDOWS)
82# ifndef WINAPI
83# define WINAPI __stdcall
84# endif
85 typedef struct HINSTANCE__* HINSTANCE;
86 typedef char* LPSTR;
87 typedef wchar_t* PWSTR;
88# ifdef BJ_COMPILER_MSVC
89# if defined(UNICODE) && UNICODE
90 int wmain(int argc, wchar_t* wargv[], wchar_t* wenvp) {
91 (void)argc; (void)wargv; (void)wenvp;
92 return bj_call_main(0, NULL, bj_main);
93 }
94# else
95 int main(int argc, char* argv[]) {
96 (void)argc; (void)argv;
97 return bj_call_main(0, NULL, bj_main);
98 }
99# endif
100# endif
101# ifdef __cplusplus
102 extern "C" {
103# endif
104# if defined(UNICODE) && UNICODE
105 int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrev, PWSTR szCmdLine, int sw) {
106# else
107 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) {
108# endif
109 (void)hInst; (void)hPrev; (void)szCmdLine; (void)sw;
110 return bj_call_main(0, NULL, bj_main);
111 }
112# ifdef __cplusplus
113 }
114# endif
115# else
116 int main(int argc, char* argv[]) {
117 return bj_call_main(argc, argv, bj_main);
118 }
119# endif
120# endif
121# define main bj_main
122# endif
123#endif
124
125
General-purpose definitions for Banjo API.