2005/5/9

     
 

Main.cpp

artefaktur
// -*- mode:C++; tab-width:2; c-basic-offset:2; indent-tabs-mode:nil -*- 
//
// Copyright (C) 2000-2005 by Roger Rene Kommer / artefaktur, Kassel, Germany.
// 
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public License (LGPL).
// 
// 
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the 
// License ACDK-FreeLicense document enclosed in the distribution
// for more for more details.
// This file is part of the Artefaktur Component Development Kit:
//                         ACDK
// 
// Please refer to
// - http://www.acdk.de
// - http://www.artefaktur.com
// - http://acdk.sourceforge.net
// for more information.
// 
// $Header: /cvsroot/acdk/acdk/acdk_core/src/acdk/cfgscript/acdkcfgscript/Main.cpp,v 1.31 2005/05/02 23:12:05 kommer Exp $
#include <acdk.h>
#include <acdk/lang/System.h>
#include <acdk/io/IOException.h>

#include "Main.h"

#include <acdk/util/logging/Log.h>
#include <acdk/util/logging/ConsoleConsumer.h>
#include <acdk/util/logging/SimpleFormatter.h>
#include <acdk/lang/sys/core_memtrace.h>

namespace acdk {
namespace cfgscript {

namespace acdkcfgscript {
using namespace acdk::util::logging;


void 
Main::help()
{
  System::out->println(SBSTR(
    "CfgScript Interpreter. Copyright 2003-2005 by Roger Rene Kommer, artefaktur\n"
    "Syntax:\n"
    "  acdkcfgscript <acdk-options> <cfgscript-options> file.csf <script arguments>\n"
    "  acdkcfgscript <acdk-options> <cfgscript-options> -e <scriptcode>\n"
    "cfgscript-options:\n"
    << Script::getCfgScriptCommandLineHelp()
    << "\nacdk-options:\n"
    << System::getSystemCmdLineOps()));
}



int 
Main::interActive(IN(RProps) props)
{
  RScript script = new Script("<console>");
  Script::breakToDebug();
  int ret = script->eval(";", props);
  return ret;
}

int 
Main::start(RStringArray sargs)
{
  

  RLogger acdk_make_logger = new Logger("acdk.make");
  acdk_make_logger->addConsumer(new ConsoleConsumer(new SimpleFormatter()));
  RLogger acdk_cfgscript_logger = new Logger("acdk.cfgscript");
  acdk_cfgscript_logger->addConsumer(new ConsoleConsumer(new SimpleFormatter()));

  RStringArray args = sargs;
  args = Script::parseCfgScriptOptions(args, Nil);
  bool isSet = false;
  true || false && (isSet = true);

  if (args->length() < 2) 
  {
    help();
    return 1;
  }
  bool interactive = false;
  RString fname;
  RString evalString;
  int scriptArgsBegin = -1;
  for (int i = 1; i < args->length(); ++i)
  {
    RString opt = args[i];
    
    if (opt->equalsIgnoreCase("-i") == true)
    {
      interactive = true;
    } 
    else  if (opt->equalsIgnoreCase("-e") == true)
    {
      ++i;
      StringBuffer sb;
      for (; i < args->length(); ++i)
        sb << " " << args[i];
      evalString = sb.toString();
      break;
    }
    else if (opt->startsWith("-") == true)
    {
      System::out->println("Unknown option: " + opt);
      help();
      return 1;
    }
    else
    {
      if (fname == Nil)
        fname = opt;
      else if (scriptArgsBegin == -1)
        scriptArgsBegin = i;
    }
  }

  int ret = 0;
  RProps props = new Props(PropsParentRead, Nil, false);
  if (scriptArgsBegin != -1)
  {
    RStringArray scriptArgs = new StringArray(args->length() - scriptArgsBegin);
    for (int i = scriptArgsBegin; i < args->length(); ++i)
      scriptArgs[i - scriptArgsBegin] = args[i];
    props->setObjectVal("scriptarguments", &scriptArgs);
  }
  else
    props->setObjectVal("scriptarguments", new StringArray(0));
  props->setSingleThreaded(true);
  RScript script;
  if (fname != Nil || evalString != Nil)
  {
    try {
      if (fname != Nil)
      {
        script = new Script(fname);
        ret = script->readEval(props);
      }
      else if (evalString != Nil)
      {
        script = new Script("");
        ret = script->eval(evalString, props);
      }
    } 
    catch (acdk::io::RThrowable ex)
    {
      if (script == Nil)
        throw;
      acdk::lang::System::err->println("unhandled exception " + ex->getClass()->getName() + ":\n" + ex->getMessage() + "\nIn:");
    
      acdk::lang::System::err->println(Script::getScriptBackTrace());
      acdk::lang::System::err->println("C++:");
      ex->printStackTrace(acdk::lang::System::err);
      return 1;
    }
  }
  if (interactive == true)
    return interActive(props);
  return ret;
  //return 0;
}


} 
}
}

struct MemChecker
{
  acdk::lang::sys::core_memtrace trace;
  MemChecker(bool memLeakOnly = true)
    : trace(memLeakOnly)
  {
  }
  ~MemChecker() 
  {
    trace.reportUnfreed(::acdk::lang::sys::MTRFUnfreed | ::acdk::lang::sys::MTRFMergeSameBt | 
                        ::acdk::lang::sys::MTRFRootsOnly | ::acdk::lang::sys::MTRFNoStatics);
    //trace.reportUnfreed(::acdk::lang::sys::MTRFMergeSameBt);
  }
};
//MemChecker _memchecker(false);
int
main(int argc, char* argv[], char** envptr)
{
  int erg = acdk::lang::System::main(::acdk::cfgscript::acdkcfgscript::Main::start, argc, argv, envptr);
  return erg;  

}