2005/5/9

     
 

SystemIntern.h

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/lang/SystemIntern.h,v 1.12 2005/04/09 19:26:51 kommer Exp $
#ifndef acdk_lang_SystemIntern_h
#define acdk_lang_SystemIntern_h
#if !defined(DOXYGENONLY)

namespace acdk {
namespace lang {

/** 
Holds the arguments from commandline without the acdk specific
    arguments. 
*/
foreign
class ACDK_CORE_PUBLIC ArgumentHolder
{
public:
  ArgumentHolder(IN(RStringArray) args)
  {
    if (args == Nil)
    {
      argc = 0;
      argv = new char*[1];
      argv[0] = 0;
      return;
    }
    argc = args->length();
    argv = new char*[argc + 1]; // one more for trailing NULL-pointer
    for (int i = 0; i < argc; i++) {
      RString sa = args[i];
      sa = sa->convert(CCAscii); // ### use a environment variable to determine external encoding
      int salen = sa->length();
      argv[i] = new char[salen + 1];
      
      const char* ptr = sa->c_str();
      strncpy(argv[i], ptr, salen);
      argv[i][salen] = 0;
    }
    argv[argc] = 0; // needed for some implementations (envp)
  }
  ~ArgumentHolder()
  {
    for (int i = 0; i < argc; i++) {
      delete [] argv[i];
      argv[i] = 0;
    }
    delete [] argv;
  }
  int& getArgc() { return argc; }
  char** getArgv() { return argv; }
private:
  int    argc;
  char** argv;
};

/**
  Same like ArgumentHolder but holds
  platform Unicode (16bit) arguments
*/
foreign
class ACDK_CORE_PUBLIC UcArgumentHolder
{
public:
  UcArgumentHolder(IN(RStringArray) args)
  {
    argc = args->length();
    argv = new ucchar*[argc + 1]; // one more for trailing NULL-pointer
    for (int i = 0; i < argc; i++) 
    {
      RString sa = args[i];
      sa = sa->convert(CCUcs2); 
      int salen = sa->length();
      argv[i] = new ucchar[salen + 1];
      
      const ucchar* ptr = sa->uc2c_str();
      memcpy(argv[i], ptr, salen * sizeof(ucchar));
      argv[i][salen] = 0;
    }
    argv[argc] = 0; // needed for some implementations (envp)
  }
  ~UcArgumentHolder()
  {
    for (int i = 0; i < argc; i++) {
      delete [] argv[i];
      argv[i] = 0;
    }
    delete [] argv;
  }
  int& getArgc() { return argc; }
  ucchar** getArgv() { return argv; }
private:
  int    argc;
  ucchar** argv;
};

/** @internal */
foreign
class ACDK_CORE_PUBLIC UcEnvBlockHolder
{
public:
  ucchar* block;
  int size;
  UcEnvBlockHolder(IN(RStringArray) args)
  : block(0)
  , size(0)
  {
    if (args == Nil || args->length() == 0)
      return;
    int i;
    int charCount = 0;
    for (i = 0; i < args->length(); ++i)
    {
      charCount += args[i]->length() + 1;
    }
    ++charCount;
    block = new ucchar[charCount];
    ucchar* bptr = block;
    for (i = 0; i < args->length(); ++i)
    {
      RString s= args[i];
      for (String::iterator it = s->begin(); it < s->end(); ++it)
      {
        *bptr++ = *it;
      }
      *bptr++ = 0;
    }
    *bptr++ = 0;
  }
  ~UcEnvBlockHolder()
  {
    delete block;
  }
};

/** @internal */
foreign
class ACDK_CORE_PUBLIC EnvBlockHolder
{
public:
  char* block;
  int size;
  EnvBlockHolder(IN(RStringArray) args)
  : block(0)
  , size(0)
  
  {
    if (args == Nil || args->length() == 0)
      return;
    int i;
    int charCount = 0;
    for (i = 0; i < args->length(); ++i)
    {
      charCount += args[i]->length() + 1;
    }
    ++charCount;
    block = new char[charCount];
    char* bptr = block;
    for (i = 0; i < args->length(); ++i)
    {
      RString s= args[i];
      for (String::iterator it = s->begin(); it < s->end(); ++it)
      {
        *bptr++ = *it;
      }
      *bptr++ = 0;
    }
    *bptr++ = 0;
  }
  ~EnvBlockHolder()
  {
    delete block;
  }
};


} // namespace lang
} // namespace acdk
#endif //!defined(DOXYGENONLY)
#endif //acdk_lang_SystemIntern_h