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_WINDOWS)
21# define BJ_AUTOMAIN
22# elif defined(BJ_OS_IOS)
23# define BJ_AUTOMAIN
24# endif
25#endif
26
27// // Rename user's main function
28// #if defined(BJ_AUTOMAIN) || defined(BJ_AUTOMAIN_CALLBACKS)
29// # define main bj_main
30// #endif
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
36#if defined(BJ_AUTOMAIN) || defined(BJ_AUTOMAIN_CALLBACKS)
37extern int bj_main(int argc, char* argv[]);
38extern int bj_call_main(int argc, char* argv[], int (*function)(int argc, char* argv[]));
39#endif
40
41#ifdef BJ_AUTOMAIN_CALLBACKS
42
43typedef enum bj_callback_result_t
44{
45 bj_callback_exit_error = -1,
46 bj_callback_exit_success = 0,
47 bj_callback_continue = 1,
48} bj_callback_result;
49
50typedef bj_callback_result (*bj_app_begin_fn_t)(void**, int, char*[]);
51typedef bj_callback_result (*bj_app_iterate_fn_t)(void*);
52typedef bj_callback_result (*bj_app_end_fn_t)(void*, int);
53
54extern bj_callback_result bj_app_begin(void** user_data, int argc, char *argv[]);
55extern bj_callback_result bj_app_iterate(void* user_data);
56extern bj_callback_result bj_app_end(void* user_data, int status);
57
58extern int bj_call_main_callbacks(int argc, char* argv[], bj_app_begin_fn_t, bj_app_iterate_fn_t, bj_app_end_fn_t);
59
60#endif
61
62
63#ifdef __cplusplus
64}
65#endif
66
67#if !defined(BJ_NO_AUTOMAIN) && !defined(BJ_MAIN_NOIMPL)
68 #if defined(BJ_AUTOMAIN_CALLBACKS) || defined(BJ_AUTOMAIN)
69# ifdef main
70# undef main
71# endif
72# ifdef BJ_AUTOMAIN_CALLBACKS
73# define BJ_MAIN_CALLBACK_STANDARD 1
74 int bj_main(int argc, char* argv[]) {
75 return bj_call_main_callbacks(argc, argv, bj_app_begin, bj_app_iterate, bj_app_end);
76 }
77# endif
78# if (!defined(BJ_AUTOMAIN_CALLBACKS) || defined(BJ_MAIN_CALLBACK_STANDARD))
79# if defined(BJ_OS_WINDOWS)
80# ifndef WINAPI
81# define WINAPI __stdcall
82# endif
83 typedef struct HINSTANCE__* HINSTANCE;
84 typedef char* LPSTR;
85 typedef wchar_t* PWSTR;
86# ifdef BJ_COMPILER_MSVC
87# if defined(UNICODE) && UNICODE
88 int wmain(int argc, wchar_t* wargv[], wchar_t* wenvp) {
89 (void)argc; (void)wargv; (void)wenvp;
90 return bj_call_main(0, NULL, bj_main);
91 }
92# else
93 int main(int argc, char* argv[]) {
94 (void)argc; (void)argv;
95 return bj_call_main(0, NULL, bj_main);
96 }
97# endif
98# endif
99# ifdef __cplusplus
100 extern "C" {
101# endif
102# if defined(UNICODE) && UNICODE
103 int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrev, PWSTR szCmdLine, int sw) {
104# else
105 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) {
106# endif
107 (void)hInst; (void)hPrev; (void)szCmdLine; (void)sw;
108 return bj_call_main(0, NULL, bj_main);
109 }
110# ifdef __cplusplus
111 }
112# endif
113# else
114 int main(int argc, char* argv[]) {
115 return bj_call_main(argc, argv, bj_main);
116 }
117# endif
118# endif
119# define main bj_main
120# endif
121#endif
122
123
General-purpose definitions for Banjo API.