00001 #define private public
00002 #include "magic/mobject.h"
00003 #include "magic/mapplic.h"
00004 #include "magic/mclass.h"
00005
00006 #include <time.h>
00007
00008 impl_dynamic (Application, {Object});
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00032
00033
00034
00035
00036
00037
00038
00040
00041 void myterminate () {
00042 printf ("%%ERR: Program terminated for unspecified reason\n"
00043 "%%ERR: This is possibly due to a bad exception\n"
00044 "%%ERR: or some other internal error\n");
00045 exit (1);
00046 }
00047
00048 void myunexpected () {
00049 printf ("%%ERR: Bad exception was thrown. Exiting...\n");
00050 exit (1);
00051 }
00052
00053
00054 extern int newtrace_disabled;
00055
00056 int main (int argc, char** argv) {
00057 set_terminate (myterminate);
00058 set_unexpected (myunexpected);
00059
00060 randomize;
00061
00062 #ifndef DISABLE_ALL_MEMORY_DEBUGGING
00063
00064
00065 newtrace_disabled = false;
00066 #endif
00067
00068 if (appclass) {
00069
00070 newComment ("Application instance");
00071 Application* app = static_cast <Application*> (
00072 &(ClassLib::getinstance (appclass->getname())));
00073
00074
00075 if (app) {
00076 app->setParams (argc, argv);
00077
00078
00079 try {
00080 app->main (app->params());
00081 if (app->getTried()==1)
00082 app->main ();
00083 } catch (assertion_failed e) {
00084
00085 fprintf (stderr, "%%EXCEPTION: Caught at main level\n %s\n",
00086 (CONSTR) e.what());
00087 exit (1);
00088 } catch (exception e) {
00089 fprintf (stderr,
00090 "%%exception: Caught at main level\n %s\n", e.what());
00091 exit (1);
00092 } catch (Exception e) {
00093 fprintf (stderr,
00094 "%%Exception: Caught at main level\n %s\n", (CONSTR) e.what());
00095 exit (1);
00096 }
00097 delete app;
00098 } else {
00099
00100 serr.printf ("%%ERR: Internal error in Application "
00101 "class creation\n"
00102 "%%ERR: An Application class was found "
00103 "with name '%s',\n"
00104 "%%ERR: but it was not possible to get an instance "
00105 "for it\n",
00106 (CONSTR) appclass->getname());
00107
00108 }
00109 } else {
00110 fprintf (stderr, "%%ERR: No Application decendant found\n");
00111 }
00112
00113 #ifndef DISABLE_ALL_MEMORY_DEBUGGING
00114
00115 if (dbgnewmalloced>0) {
00116 fprintf (stderr, "%%ERR: Detected memory leaks!!!!\n");
00117 list_allocations ();
00118 }
00119 #endif
00120
00121 return 0;
00122 }
00123
00124 void Application::setParams (int argc, char** argv) {
00125 mArgc = argc;
00126 mArgv = argv;
00127
00128
00129
00130 Array<String> params;
00131 if (argc>1)
00132 params.resize (argc-1);
00133
00134 for (int i=0; i<params.size; i++)
00135 params [i] = argv[i+1];
00136
00137
00138 StringMap paramMap;
00139 for (int p=0; p<params.size; p++)
00140 if (params[p].length()>1 && params[p][0]=='-') {
00141 String prm2 = params[p].mid(1);
00142 Array<String> lr;
00143 prm2.split (lr, '=');
00144 if (lr.size==1) {
00145 mParams.add (params[p]);
00146 } else if (lr.size>2) {
00147 serr.printf ("Parameters must follow format: -param=value\n");
00148 exit (1);
00149 } else
00150 mParamMap.set (lr[0],lr[1]);
00151 } else
00152 mParams.add (params[p]);
00153 }
00154
00155 void Application::readConfig (const String& filename) {
00156 StringMap paramMap = readStringMap (filename);
00157
00158
00159 paramMap += mParamMap;
00160
00161 mParamMap = paramMap;
00162
00163
00164 mParamMap.failByThrow ();
00165 }
00166
00171