You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							342 lines
						
					
					
						
							12 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							342 lines
						
					
					
						
							12 KiB
						
					
					
				| /* ///////////////////////////////////////////////////////////////////////// | |
|  * File:        test/scratch/test.scratch.fe/test.scratch.fe.cpp | |
|  * | |
|  * Purpose:     Implementation file for the test.scratch.fe project. | |
|  * | |
|  * Created:     21st June 2005 | |
|  * Updated:     6th August 2012 | |
|  * | |
|  * Status:      Wizard-generated | |
|  * | |
|  * License:     (Licensed under the Synesis Software Open License) | |
|  * | |
|  *              www:        http://www.synesis.com.au/software | |
|  * | |
|  *              This source code is placed into the public domain 2005 | |
|  *              by Synesis Software Pty Ltd. There are no restrictions | |
|  *              whatsoever to your use of the software. | |
|  * | |
|  *              This source code is provided by Synesis Software Pty Ltd "as is" | |
|  *              and any warranties, whether expressed or implied, including, but | |
|  *              not limited to, the implied warranties of merchantability and | |
|  *              fitness for a particular purpose are disclaimed. In no event | |
|  *              shall the Synesis Software Pty Ltd be liable for any direct, | |
|  *              indirect, incidental, special, exemplary, or consequential | |
|  *              damages (including, but not limited to, procurement of | |
|  *              substitute goods or services; loss of use, data, or profits; or | |
|  *              business interruption) however caused and on any theory of | |
|  *              liability, whether in contract, strict liability, or tort | |
|  *              (including negligence or otherwise) arising in any way out of | |
|  *              the use of this software, even if advised of the possibility of | |
|  *              such damage. | |
|  * | |
|  *              Neither the name of Synesis Software Pty Ltd nor the names of | |
|  *              any subdivisions, employees or agents of Synesis Software Pty | |
|  *              Ltd, nor the names of any other contributors to this software | |
|  *              may be used to endorse or promote products derived from this | |
|  *              software without specific prior written permission. | |
|  * | |
|  * ////////////////////////////////////////////////////////////////////// */ | |
| 
 | |
| 
 | |
| #define PANTHEIOS_NO_INCLUDE_OS_AND_3PTYLIB_STRING_ACCESS | |
|  | |
| /* This inclusion required for suppressing warnings during NoX (No eXception-support) configurations. */ | |
| #include <pantheios/util/test/compiler_warnings_suppression.first_include.h> | |
|  | |
| /* Pantheios Header Files */ | |
| #include <pantheios/pantheios.hpp> | |
| #include <pantheios/inserters/integer.hpp> | |
| #include <pantheios/inserters/pointer.hpp> | |
| #include <pantheios/inserters/real.hpp> | |
| #include <pantheios/backend.h> | |
| #include <pantheios/frontend.h> | |
| #include <pantheios/quality/contract.h> | |
|  | |
| /* STLSoft Header Files */ | |
| #include <stlsoft/stlsoft.h> | |
|  | |
| /* Standard C++ Header Files */ | |
| #include <exception> | |
| #include <iostream> | |
| #include <string> | |
|  | |
| using std::cerr; | |
| using std::cin; | |
| using std::cout; | |
| using std::endl; | |
| 
 | |
| /* Standard C Header Files */ | |
| #include <stdio.h> | |
|  | |
| #include <pantheios/util/test/compiler_warnings_suppression.last_include.h> | |
|  | |
| /* ///////////////////////////////////////////////////////////////////////// | |
|  * Forward declarations | |
|  */ | |
| 
 | |
| #if (   defined(_WIN32) || \ | |
|         defined(_WIN64)) && \ | |
|     !defined(_INC_WINDOWS) | |
| extern "C" void __stdcall Sleep(unsigned long); | |
| #endif /* WIN32 */ | |
|  | |
| /* ///////////////////////////////////////////////////////////////////////// | |
|  * Globals | |
|  */ | |
| 
 | |
| static int  severities[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; | |
| 
 | |
| /* ////////////////////////////////////////////////////////////////////// */ | |
| 
 | |
| #ifdef PANTHEIOS_USE_WIDE_STRINGS | |
|  | |
| int main() | |
| { | |
|         return 0; | |
| } | |
| 
 | |
| #else /* ? PANTHEIOS_USE_WIDE_STRINGS */ | |
|  | |
| /* ////////////////////////////////////////////////////////////////////// */ | |
| 
 | |
| //static void call_all_severities(); | |
|  | |
| static void call_all_severities() | |
| { | |
|     pantheios::log_DEBUG("I'm so gorgeous, there's a six month waiting list for birds to suddenly appear, every time I am near!"); | |
|     pantheios::log_INFORMATIONAL("Your nickname was never Ace. Maybe Ace Hole."); | |
|     pantheios::log_NOTICE("Please rush me my portable walrus polishing kit. Four super brushes that will clean even the trickiest of seabound mammals."); | |
|     pantheios::log_WARNING("Now kindly cluck off, before I extract your gibblets, and shove a large seasoned onion between the lips you never kiss with."); | |
|     pantheios::log_ERROR("So this is really me? A no-style gimbo with teeth druids could use as a place of worship?"); | |
|     pantheios::log_CRITICAL("Well, the thing about a black hole - it's main distinguishing feature - is it's black. And the thing about space, your basic space colour is black. So how are you supposed to see them?"); | |
|     pantheios::log_ALERT("You actually expect something to go right for me? Arnold schmucko Rimmer? Tosspot by royal appointment?"); | |
|     pantheios::log_EMERGENCY("Emergency, there's an emergency going on, it's still going on, it's still an emergency"); | |
| } | |
| 
 | |
| static int main_(int /* argc */, char ** /*argv*/) | |
| { | |
| #if defined(_DEBUG) | |
|     { | |
|         using namespace pantheios; | |
| 
 | |
|         short                   s     = 123; | |
|         int                     i     = 456; | |
|         long                    l     = 789; | |
|         float                   f     = static_cast<float>(0.123); | |
|         double                  d     = 0.456; | |
|         long double             ld    = 0.789; | |
|         void                    *p    = &l; | |
| #if 0 | |
|         char const              *lstr = "{a pointer to a C-style string}"; | |
|         std::string             str   = "{an instance of std::string}"; | |
|         stlsoft::simple_string  sstr  = "{an instance of stlsoft::simple_string}"; | |
|         #if defined(PLATFORMSTL_OS_IS_WINDOWS) | |
|         SYSTEMTIME              tm    = GetCurrentTime_SYSTEMTIME(); | |
|         #else /* ? PLATFORMSTL_OS_IS_???? */ | |
|         struct tm const         *tm   = GetCurrentTime_tm(); | |
|         #endif /* PLATFORMSTL_OS_IS_???? */ | |
| #endif /* 0 */ | |
|  | |
| #if 0 | |
|         log_INFORMATIONAL("This is a (hopefully) typical error string, containing: " | |
|                         , "some integers (", integer(s), ", ", integer(i), ", ", integer(l), "); " | |
|                         , "some real numbers (", real(f), ", ", real(d), ", ", real(ld), "); " | |
|                         , "a pointer (", pointer(p, fmt::hex), "); " | |
|                         , "some strings (", lstr, ", ", str, ", ", sstr, "); " | |
|                         , "and a converted time value (", tm, ")" | |
|                         ); | |
| #else /* ? 0 */ | |
|         log_INFORMATIONAL( | |
|                           "Integers (", integer(s, 4 | fmt::zeroPad), ", ", integer(i), ", ", integer(l), "); " | |
|                         , "floating points (", real(f), ", ", real(d), ", ", real(ld), "); " | |
|                         , "and a pointer (", pointer(p, fmt::hex | fmt::zeroXPrefix), ")"); | |
| 
 | |
| #endif /* 0 */ | |
|     } | |
| 
 | |
| # if defined(PLATFORMSTL_OS_IS_WINDOWS) | |
|     { | |
|         VARIANT var; | |
| 
 | |
|         ::VariantInit(&var); | |
|         var.vt = VT_I4; | |
|         var.lVal = 12345678; | |
| 
 | |
|         HWND    hwnd    =   ::GetDesktopWindow(); | |
| 
 | |
|         pantheios::log_INFORMATIONAL("v=", var, "; h=", hwnd); | |
|     } | |
| # endif /* PLATFORMSTL_OS_IS_WIN?? */ | |
|  | |
| #endif | |
|  | |
| 
 | |
|     cout << endl << "Output with all severity levels on:" << endl; | |
|     call_all_severities(); | |
| 
 | |
|     cout << endl << "Output after switching off PANTHEIOS_SEV_CRITICAL:" << endl; | |
|     severities[PANTHEIOS_SEV_CRITICAL] = 0; | |
|     call_all_severities(); | |
| 
 | |
|     cout << endl << "Output after switching off PANTHEIOS_SEV_DEBUG:" << endl; | |
|     severities[PANTHEIOS_SEV_DEBUG] = 0; | |
|     call_all_severities(); | |
| 
 | |
|     cout << endl << "Output after switching off PANTHEIOS_SEV_WARNING:" << endl; | |
|     severities[PANTHEIOS_SEV_WARNING] = 0; | |
|     call_all_severities(); | |
| 
 | |
|     cout << endl << "Output after switching off PANTHEIOS_SEV_INFORMATIONAL:" << endl; | |
|     severities[PANTHEIOS_SEV_INFORMATIONAL] = 0; | |
|     call_all_severities(); | |
| 
 | |
|     cout << endl << "Output after switching off PANTHEIOS_SEV_ERROR:" << endl; | |
|     severities[PANTHEIOS_SEV_ERROR] = 0; | |
|     call_all_severities(); | |
| 
 | |
|     cout << endl << "Output after switching off PANTHEIOS_SEV_EMERGENCY:" << endl; | |
|     severities[PANTHEIOS_SEV_EMERGENCY] = 0; | |
|     call_all_severities(); | |
| 
 | |
|     cout << endl << "Output after switching off PANTHEIOS_SEV_ALERT:" << endl; | |
|     severities[PANTHEIOS_SEV_ALERT] = 0; | |
|     call_all_severities(); | |
| 
 | |
|     cout << endl << "Output after switching off PANTHEIOS_SEV_NOTICE:" << endl; | |
|     severities[PANTHEIOS_SEV_NOTICE] = 0; | |
|     call_all_severities(); | |
| 
 | |
|     cout << endl << "Output complete" << endl; | |
| 
 | |
|     return 0; | |
| } | |
| 
 | |
| int main(int argc, char *argv[]) | |
| { | |
| #if 0 | |
|     for(;;) {} | |
| #endif /* 0 */ | |
|  | |
| #ifdef STLSOFT_CF_EXCEPTION_SUPPORT | |
|     try | |
|     { | |
| #endif /* STLSOFT_CF_EXCEPTION_SUPPORT */ | |
|  | |
|         return main_(argc, argv); | |
| 
 | |
| #ifdef STLSOFT_CF_EXCEPTION_SUPPORT | |
|     } | |
|     catch(std::exception &x) | |
|     { | |
|         fprintf(stderr, "Unhandled error: %s\n", x.what()); | |
|     } | |
|     catch(...) | |
|     { | |
|         pantheios::logputs(pantheios::emergency, "Unhandled unknown error"); | |
|     } | |
| 
 | |
|     return EXIT_FAILURE; | |
| #endif /* STLSOFT_CF_EXCEPTION_SUPPORT */ | |
| } | |
| 
 | |
| /* ////////////////////////////////////////////////////////////////////// */ | |
| 
 | |
| #endif /* PANTHEIOS_USE_WIDE_STRINGS */ | |
|  | |
| /* ////////////////////////////////////////////////////////////////////// */ | |
| 
 | |
| void* const  BACKEND_TOKEN_VALUE    =   NULL; | |
| 
 | |
| PANTHEIOS_CALL(int) pantheios_be_init( | |
|     PAN_CHAR_T const*   processIdentity | |
| ,   void*               reserved | |
| ,   void**              ptoken | |
| ) | |
| { | |
|     STLSOFT_SUPPRESS_UNUSED(reserved); | |
|     PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(NULL != ptoken, "token pointer may not be null"); | |
| 
 | |
|     *ptoken = BACKEND_TOKEN_VALUE; | |
| 
 | |
|     // Normally one would likely not seek to do anything at this point, since | |
|     // it's *very* early in the process initialisation, and the raison d'etre | |
|     // of Pantheios is to be the output library! ;-) | |
|     // | |
|     // However, for pedagogical purposes in this case, we seek to print out the | |
|     // initialisation criteria. | |
|     // | |
|     // But this illustrates an important point: we can't use use IOStreams, | |
|     // because some libraries are not initialised by this point and the process | |
|     // actually crashes. | |
|     // | |
|     // So, _if_ you seek to do some output you should bear in mind the very | |
|     // early nature of this call and, at most, use the C streams. (Even better | |
|     // would be to use underlying OS calls, e.g. ::write() or | |
|     // ::OutputDebugString(). | |
|  | |
|     ::fprintf(stdout, "Pantheios initialised (%s, %p)\n", processIdentity, reserved); | |
| //  cout << "Pantheios initialised (" << processIdentity << ", " << reserved << ")" << endl; | |
|  | |
|     return 0; | |
| } | |
| 
 | |
| PANTHEIOS_CALL(void) pantheios_be_uninit(void *token) | |
| { | |
|     PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(BACKEND_TOKEN_VALUE == token, "back-end token is not expected value"); | |
| 
 | |
|     ::fprintf(stdout, "Pantheios uninitialised (%p)\n", token); | |
| //  cout << "Pantheios uninitialised (" << token << ")" << endl; | |
| } | |
| 
 | |
| PANTHEIOS_CALL(int) pantheios_be_logEntry( | |
|     void*               feToken | |
| ,   void*               beToken | |
| ,   int                 severity | |
| ,   PAN_CHAR_T const*   entry | |
| ,   size_t              /* cchEntry */ | |
| ) | |
| { | |
|     PANTHEIOS_CONTRACT_ENFORCE_PRECONDITION_PARAMS_API(BACKEND_TOKEN_VALUE == beToken, "back-end token is not expected value"); | |
|     STLSOFT_SUPPRESS_UNUSED(feToken); | |
|     STLSOFT_SUPPRESS_UNUSED(beToken); | |
| 
 | |
|     cout << "Pantheios log entry [" << severity << ": " << pantheios::pantheios_getSeverityString(static_cast<pantheios::pan_sev_t>(severity)) << "]: " << entry << endl; | |
| 
 | |
|     return 0; | |
| } | |
| 
 | |
| /* ////////////////////////////////////////////////////////////////////// */ | |
| 
 | |
| PANTHEIOS_CALL(int) pantheios_fe_init( | |
|     void*   reserved | |
| ,   void**  ptoken | |
| ) | |
| { | |
|     STLSOFT_SUPPRESS_UNUSED(reserved); | |
|     STLSOFT_SUPPRESS_UNUSED(ptoken); | |
| 
 | |
|     return 0; | |
| } | |
| 
 | |
| PANTHEIOS_CALL(void) pantheios_fe_uninit(void *token) | |
| { | |
|     STLSOFT_SUPPRESS_UNUSED(token); | |
| } | |
| 
 | |
| PANTHEIOS_CALL(PAN_CHAR_T const*) pantheios_fe_getProcessIdentity(void *token) | |
| { | |
|     STLSOFT_SUPPRESS_UNUSED(token); | |
| 
 | |
|     return PANTHEIOS_LITERAL_STRING("panetheios::test.scratch.fe"); | |
| } | |
| 
 | |
| PANTHEIOS_CALL(int) pantheios_fe_isSeverityLogged(void *token, int severity, int backEndId) | |
| { | |
|     STLSOFT_SUPPRESS_UNUSED(token); | |
|     STLSOFT_SUPPRESS_UNUSED(backEndId); | |
| 
 | |
|     return severities[severity]; | |
| } | |
| 
 | |
| /* ///////////////////////////// end of file //////////////////////////// */
 |