wow. that was easy: git mv core nucleus
[feisty_meow.git] / nucleus / library / application / hoople_main.h
diff --git a/nucleus/library/application/hoople_main.h b/nucleus/library/application/hoople_main.h
new file mode 100644 (file)
index 0000000..aac5a74
--- /dev/null
@@ -0,0 +1,122 @@
+#ifndef HOOPLE_MAIN_GROUP
+#define HOOPLE_MAIN_GROUP
+
+/*****************************************************************************\
+*                                                                             *
+*  Name   : HOOPLE_MAIN group
+*  Author : Chris Koeritz
+*                                                                             *
+*******************************************************************************
+* Copyright (c) 2000-$now By Author.  This program is free software; you can  *
+* redistribute it and/or modify it under the terms of the GNU General Public  *
+* License as published by the Free Software Foundation; either version 2 of   *
+* the License or (at your option) any later version.  This is online at:      *
+*     http://www.fsf.org/copyleft/gpl.html                                    *
+* Please send any updates to: fred@gruntose.com                               *
+\*****************************************************************************/
+
+//! @file "hoople_main.h" Provides macros that implement the 'main' program of an application.
+
+#include "application_shell.h"
+#include "command_line.h"
+#include "windoze_helper.h"
+
+#include <basis/contracts.h>
+#include <loggers/critical_events.h>
+#include <loggers/combo_logger.h>
+#include <structures/static_memory_gremlin.h>
+#include <loggers/program_wide_logger.h>
+
+namespace application {
+
+// The following versions of main programs are provided for different operating
+// systems and compilation environments.  These support the requirements of the
+// HOOPLE startup code and program-wide features, assuming an object derived
+// from base_application is available.
+// The object derived from base_application must be provided in "obj_name".
+// The "obj_args" are any arguments that need to be passed to the object's
+// constructor; this list can be empty.
+// Note that the default logger used for unix and console mode win32 programs
+// is the console logger; that can be changed in the startup code for the
+// "obj_name".
+
+#define HOOPLE_STARTUP_CODE \
+  DEFINE_INSTANCE_HANDLE;
+
+#ifdef __WXWIDGETS__
+  //! main program for applications using WxWidgets library.
+  #define HOOPLE_MAIN(obj_name, obj_args) \
+    HOOPLE_STARTUP_CODE; \
+    int main(int argc, char *argv[]) { \
+      SET_ARGC_ARGV(argc, argv); \
+      SETUP_COMBO_LOGGER; \
+      obj_name to_run_obj obj_args; \
+      return to_run_obj.execute_application(); \
+    }
+
+//////////////
+
+#elif defined(__UNIX__)
+  //! options that should work for most unix and linux apps.
+  #define HOOPLE_MAIN(obj_name, obj_args) \
+    HOOPLE_STARTUP_CODE; \
+    int main(int argc, char *argv[]) { \
+      SET_ARGC_ARGV(argc, argv); \
+      SETUP_COMBO_LOGGER; \
+      obj_name to_run_obj obj_args; \
+      return to_run_obj.execute_application(); \
+    }
+
+//////////////
+
+#elif defined(__WIN32__)
+  // for win32 we need to support four different environments--console mode,
+  // borland compilation, MFC programs and regular windows programs.
+  #ifdef _CONSOLE
+    //! console mode programs can easily write to a command shell.
+    #define HOOPLE_MAIN(obj_name, obj_args) \
+      HOOPLE_STARTUP_CODE; \
+      int main(int argc, char *argv[]) { \
+        SETUP_COMBO_LOGGER; \
+        SET_ARGC_ARGV(argc, argv); \
+        obj_name to_run_obj obj_args; \
+        return to_run_obj.execute_application(); \
+      }
+  #elif defined(_AFXDLL)
+    //! MFC applications generally use a tiny shell which hooks up logging.
+    #define HOOPLE_MAIN(obj_name, obj_args)  \
+      HOOPLE_STARTUP_CODE; \
+      SET_ARGC_ARGV(__argc, __argv); \
+      tiny_application<obj_name> theApp;
+  #elif defined(__WIN32__)
+    //! standard win32 applications have no console, so we just log to a file.
+    #define HOOPLE_MAIN(obj_name, obj_args)  \
+      HOOPLE_STARTUP_CODE; \
+      int WINAPI WinMain(application_instance instance, \
+          application_instance prev_instance, LPSTR lpCmdLine, \
+          int nCmdShow) { \
+        SET_ARGC_ARGV(__argc, __argv); \
+        SET_INSTANCE_HANDLE(instance); \
+        SETUP_FILE_LOGGER; \
+        obj_name to_run_obj obj_args; \
+        return to_run_obj.execute_application(); \
+      }
+  #endif
+
+//////////////
+
+#else  // not __UNIX__ or __WIN32__
+  //! just guessing this might work; otherwise we have no idea.
+  #define HOOPLE_MAIN(obj_name, obj_args)  \
+    HOOPLE_STARTUP_CODE; \
+    int main(int argc, char *argv[]) { \
+      SETUP_CONSOLE_LOGGER; \
+      obj_name to_run_obj obj_args; \
+      return to_run_obj.execute_application(); \
+    }
+#endif
+
+} //namespace.
+
+#endif // outer guard.
+