亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? appconf.cpp

?? 這是一款2d游戲引擎
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
    if ( m_szCurrentPath == NULL || len > strlen(m_szCurrentPath) ) {
      // old buffer too small, alloc new one
      if ( m_szCurrentPath != NULL )
        delete [] m_szCurrentPath;
      m_szCurrentPath = new char[len + 1];
    }

    // copy and delete pointer returned by normalizePath
    strcpy(m_szCurrentPath, szNormPath);

    delete [] szNormPath;
  }
}

void BaseConfig::setCurrentPath(const char *szPath)
{
  changeCurrentPath();		      // goto root
  changeCurrentPath(szPath);	  // now use relative change
}

const char *BaseConfig::getCurrentPath() const
{
  return m_szCurrentPath == NULL ? "" : m_szCurrentPath;
}

// ----------------------------------------------------------------------------
// filters (NB: filterOut(filterIn()) shouldn't change the string)
// ----------------------------------------------------------------------------

// called before writing
char *BaseConfig::filterOut(const char *szValue)
{
  // quote entire string if it starts with space or with quote
  Bool bDoQuote = isspace(*szValue) || (*szValue == '"');

  // calculate the length of resulting string
  size_t len = Strlen(szValue);

  const char *pcIn = szValue;
  while ( *pcIn ) {
    switch ( *pcIn++ ) {
      case '"':
        if ( !bDoQuote )
          break;
        //else: fall through

      case '\n':
      case '\t':
      case '\\':
        // one for extra '\'
        len++;
        break;
    }
  }

  if ( bDoQuote )
    len += 2;

  char *szBuf = new char[len + 1];
  char *pcOut = szBuf;

  if ( bDoQuote )
    *pcOut++ = '"';

  char c;
  for ( pcIn = szValue; *pcIn != '\0'; pcIn++ ) {
    switch ( *pcIn ) {
      case '\n':
        c = 'n';
        break;

      case '\t':
        c = 't';
        break;

      case '\\':
        c = '\\';
        break;

      case '"':
        if ( bDoQuote )
          c = '"';
        //else: fall through

      default:
        *pcOut++ = *pcIn;
        continue;   // skip special character procession
    }

    // we get here only for special characters
    *pcOut++ = '\\';
    *pcOut++ = c;
  }

  if ( bDoQuote )
    *pcOut++ = '"';

  *pcOut = '\0';

  return szBuf;
}

// called after reading
char *BaseConfig::filterIn(const char *szValue)
{
  // it will be a bit smaller, but who cares
  char *szBuf = new char[Strlen(szValue) + 1];

  const char *pcIn  = szValue;
  char *pcOut = szBuf;

  Bool bQuoted = *pcIn == '"';
  if ( bQuoted )
    pcIn++;

  while ( *pcIn != '\0' ) {
    switch ( *pcIn ) {
      case '\\':
        switch ( *++pcIn ) {
          case 'n':
            *pcOut++ = '\n';
            break;

          case 't':
            *pcOut++ = '\t';
            break;

          case '\\':
            *pcOut++ = '\\';
            break;

          case '"':
          default:
            // ignore '\'
            *pcOut++ = *pcIn;
        }
        break;

      case '"':
        if ( bQuoted ) {
          if ( *(pcIn + 1) != '\0' ) {
            LogWarning(_("invalid string '%s' in configuration file."), szValue);
          }
          break;
        }
        //else: fall through

      default:
        *pcOut++ = *pcIn;
    }

    pcIn++;
  }

  *pcOut = '\0';

  return szBuf;
}

// ----------------------------------------------------------------------------
// implementation of Enumerator subclass
// ----------------------------------------------------------------------------
BaseConfig::Enumerator::Enumerator(size_t nCount, Bool bOwnsStrings)
{
  m_bOwnsStrings = bOwnsStrings;
  m_aszData      = new char *[nCount];
  m_nCount       = 0;
}

// free memory
BaseConfig::Enumerator::~Enumerator()
{
  if ( m_bOwnsStrings ) {
    for ( size_t n = 0; n < m_nCount; n++ )
      delete [] m_aszData[n];
  }

  delete [] m_aszData;
}

void BaseConfig::Enumerator::AddString(char *sz)
{
  m_aszData[m_nCount++] = sz;
}

void BaseConfig::Enumerator::AddString(const char *sz)
{
  assert( !m_bOwnsStrings );

  // we won't delete it (see assert above), so we can cast in "char *"
  m_aszData[m_nCount++] = (char *)sz;
}

// remove duplicate strings
void BaseConfig::Enumerator::MakeUnique()
{
  char  **aszUnique = new char *[m_nCount];
  size_t  nUnique = 0;
  
  Bool bUnique;
  for ( size_t n = 0; n < m_nCount; n++ ) {
    bUnique = TRUE;
    for ( size_t n2 = n + 1; n2 < m_nCount; n2++ ) {
      if ( StrCmp(m_aszData[n], m_aszData[n2]) == 0 ) {
        bUnique = FALSE;
        break;
      }
    }

    if ( bUnique )
      aszUnique[nUnique++] = m_aszData[n];
    else if ( m_bOwnsStrings )
      delete [] m_aszData[n];
  }

  delete [] m_aszData;
  m_aszData = aszUnique;
  m_nCount = nUnique;
}

// ============================================================================
// implementation of FileConfig class
// ============================================================================

// ----------------------------------------------------------------------------
// FileConfig::ConfigEntry class
// ----------------------------------------------------------------------------

// ctor
FileConfig::ConfigEntry::ConfigEntry(ConfigGroup *pParent, 
                                     ConfigEntry *pNext, 
                                     const char *szName)
{
  m_pParent     = pParent;
  m_pNext       = pNext;
  m_szExpValue  =
  m_szValue     = 
  m_szComment   = NULL;
  m_bDirty      = 
  m_bLocal      = FALSE;

  // check for special prefix
  if ( *szName == APPCONF_IMMUTABLE_PREFIX ) {
    m_bImmutable = TRUE;
    szName++;             // skip prefix
  }
  else
    m_bImmutable = FALSE;

  m_szName  = new char[Strlen(szName) + 1]; 
  strcpy(m_szName, szName);
}

// dtor
FileConfig::ConfigEntry::~ConfigEntry()
{
  if ( m_szName != NULL )
    delete [] m_szName;

  if ( m_szValue != NULL )
    delete [] m_szValue;
    
  if ( m_szComment != NULL )
    delete [] m_szComment;

  if ( m_szExpValue != NULL )
    delete [] m_szExpValue;
}

// set value and dirty flag
void FileConfig::ConfigEntry::SetValue(const char *szValue, 
                                       Bool bLocal, Bool bFromFile)
{
   if ( m_szExpValue != NULL ) {
      delete [] m_szExpValue;
      m_szExpValue = NULL;
   }

   if ( m_szValue != NULL ) {
    // immutable changes can't be overriden (only check it here, because
    // they still can be set the first time)
    if ( m_bImmutable ) {
      LogWarning(_("attempt to change an immutable entry '%s' ignored."),
                 m_szName);
      return;
    }

    delete [] m_szValue;
  }

  // immutable entries are never changed and if an entry was just read
  // from file it shouldn't be dirty neither
  if ( !m_bImmutable && !bFromFile )
    SetDirty();

  m_bLocal = bLocal;
  if ( bLocal ) {
    // to ensure that local entries are saved we make them always dirty
    SetDirty();
  }

  if ( szValue != NULL )
  {
     m_szValue = new char[Strlen(szValue) + 1];
     strcpy(m_szValue, szValue);
  }
  else
  {
     m_szValue = NULL;
     SetDirty(FALSE);
  }
}

// set comment associated with this entry
void FileConfig::ConfigEntry::SetComment(char *szComment)
{
  assert( m_szComment == NULL );  // should be done only once
  
  // ... because we don't copy, just take the pointer
  m_szComment = szComment;
}

// set dirty flag
void FileConfig::ConfigEntry::SetDirty(Bool bDirty)
{
  // ## kludge: local entries are always dirty, otherwise they would be lost
  m_bDirty = m_bLocal ? TRUE : bDirty;
  if ( m_bDirty )
    m_pParent->SetDirty();
}

const char *FileConfig::ConfigEntry::ExpandedValue()
{
  if ( m_szExpValue == NULL ) {
    // we have only to do expansion once
    m_szExpValue = ExpandEnvVars(m_szValue);
  }

  return m_szExpValue;
}

// ----------------------------------------------------------------------------
// FileConfig::ConfigGroup class
// ----------------------------------------------------------------------------

// ctor & dtor
// -----------

FileConfig::ConfigGroup::ConfigGroup(ConfigGroup *pParent, 
                                     ConfigGroup *pNext, 
                                     const char *szName)
{ 
  m_pParent     = pParent; 
  m_pNext       = pNext; 
  m_pEntries    =
  m_pLastEntry  = NULL;
  m_pSubgroups  =
  m_pLastGroup  = NULL;
  m_bDirty      = FALSE;    // no entries yet

  m_szComment   = NULL;
  m_szName      = new char[Strlen(szName) + 1]; 
  strcpy(m_szName, szName); }

FileConfig::ConfigGroup::~ConfigGroup()
{
  // delete all entries
  ConfigEntry *pEntry, *pNextEntry;
  for ( pEntry = m_pEntries; pEntry != NULL; pEntry = pNextEntry ) {
    pNextEntry = pEntry->Next();
    delete pEntry;
  }

  // delete all subgroups
  ConfigGroup *pGroup, *pNextGroup;
  for ( pGroup = m_pSubgroups; pGroup != NULL; pGroup = pNextGroup ) {
    pNextGroup = pGroup->Next();
    delete pGroup;
  }

  if ( m_szName != NULL )
    delete [] m_szName;
}

// find
// ----

FileConfig::ConfigGroup *
            FileConfig::ConfigGroup::FindSubgroup(const char *szName) const
{
  ConfigGroup *pGroup;
  for ( pGroup = m_pSubgroups; pGroup != NULL; pGroup = pGroup->Next() ) {
    if ( !StrCmp(pGroup->Name(), szName) )
      return pGroup;
  }

  return NULL;
}

FileConfig::ConfigEntry *
            FileConfig::ConfigGroup::FindEntry(const char *szName) const
{
  ConfigEntry *pEntry;
  for ( pEntry = m_pEntries; pEntry != NULL; pEntry = pEntry->Next() ) {
    if ( !StrCmp(pEntry->Name(), szName) )
      return pEntry;
  }

  return NULL;
}

// add
// ---

// add an item at the bottom of the stack (i.e. it's a LILO really)
FileConfig::ConfigGroup *FileConfig::ConfigGroup::AddSubgroup(const char *szName)
{
  ConfigGroup *pGroup = new ConfigGroup(this, NULL, szName);

  if ( m_pSubgroups == NULL ) {
    m_pSubgroups = 
    m_pLastGroup = pGroup;
  }
  else {
    m_pLastGroup = m_pLastGroup->m_pNext = pGroup;
  }

  return pGroup;
}

// add an item at the bottom
FileConfig::ConfigEntry *FileConfig::ConfigGroup::AddEntry(const char *szName)
{
  ConfigEntry *pEntry = new ConfigEntry(this, NULL, szName);
  
  if ( m_pEntries == NULL ) {
    m_pEntries   = 
    m_pLastEntry = pEntry;
  }
  else {
    m_pLastEntry->SetNext(pEntry);
    m_pLastEntry = pEntry;
  }

  return pEntry;
}

// delete
// ------

Bool FileConfig::ConfigGroup::DeleteSubgroup(const char *szName)
{
  ConfigGroup *pGroup, *pPrevGroup = NULL;
  for ( pGroup = Subgroup(); pGroup != NULL; pGroup = pGroup->Next() ) {
    if ( StrCmp(pGroup->Name(), szName) == 0 ) {
      break;
    }

    pPrevGroup = pGroup;
  }

  if ( pGroup == NULL )
    return FALSE;

  // remove the next element in the linked list
  if ( pPrevGroup == NULL ) {
    m_pSubgroups = pGroup->Next();
  }
  else {
    pPrevGroup->m_pNext = pGroup->Next();
  }

  // adjust pointer to the last element
  if ( pGroup->Next() == NULL ) {
    m_pLastGroup = pPrevGroup == NULL ? m_pSubgroups : pPrevGroup;
  }
  
  // shouldn't have any entries/subgroups or they would be never deleted
  // resulting in memory leaks (or we then should delete them here)
  assert( pGroup->Entries() == NULL && pGroup->Subgroup() == NULL );
  delete pGroup;

  return TRUE;
}

Bool FileConfig::ConfigGroup::DeleteEntry(const char *szName)
{
  ConfigEntry *pEntry, *pPrevEntry = NULL;
  for ( pEntry = Entries(); pEntry != NULL; pEntry = pEntry->Next() ) {
    if ( StrCmp(pEntry->Name(), szName) == 0 ) {
      break;
    }

    pPrevEntry = pEntry;
  }

  if ( pEntry == NULL )
    return FALSE;

  // remove the element from the linked list
  if ( pPrevEntry == NULL ) {
    m_pEntries = pEntry->Next();
  }
  else {
    pPrevEntry->SetNext(pEntry->Next());
  }

  // adjust the pointer to the last element
  if ( pEntry->Next() == NULL ) {
    m_pLastEntry = pPrevEntry == NULL ? m_pEntries : pPrevEntry;
  }

  // ... and free memory
  delete pEntry;

  m_pParent->SetDirty();

  return TRUE;
}

// deletes this group if it has no more entries/subgroups
Bool FileConfig::DeleteIfEmpty()
{
  // check if there any other subgroups/entries left
  if ( m_pCurGroup->Entries() != NULL || m_pCurGroup->Subgroup() != NULL )
    return FALSE;

  if ( m_pCurGroup->Parent() == NULL ) {
    // top group, can't delete it but mark it as not dirty,
    // so that local config file will not even be created
    m_pCurGroup->SetDirty(FALSE);
  }
  else {
    // delete current group
    const char *szName = m_pCurGroup->Name();
    m_pCurGroup = m_pCurGroup->Parent();
    m_pCurGroup->DeleteSubgroup(szName);
  }

  // recursively call ourselves
  DeleteIfEmpty();

  return TRUE;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲宅男天堂在线观看无病毒| 国产成人精品影视| 欧美在线免费观看亚洲| 色爱区综合激月婷婷| 欧美岛国在线观看| 99免费精品视频| 韩国女主播一区二区三区| 欧美激情一区三区| 午夜精品福利一区二区蜜股av | 亚洲欧美日韩一区二区| 欧美性受极品xxxx喷水| 91丨porny丨户外露出| 欧美美女黄视频| 91久久久免费一区二区| 国产精品久久久久久久久晋中 | 一区二区欧美视频| 在线中文字幕一区二区| 91在线视频免费观看| 国产一区二区不卡| 国产欧美日韩不卡免费| 色一情一伦一子一伦一区| 国产一区二区三区免费播放 | 欧美日韩一级片在线观看| 亚洲欧美一区二区三区孕妇| 岛国精品在线播放| 国产精品一区二区在线播放| 日日夜夜精品视频免费| 成人在线综合网站| 亚洲日本乱码在线观看| 成人小视频免费在线观看| 国产精品一区二区你懂的| 亚洲少妇最新在线视频| 极品销魂美女一区二区三区| 亚洲视频一二区| 日韩欧美的一区二区| 精品99久久久久久| 亚洲欧洲无码一区二区三区| 亚洲一区二区三区小说| 欧美一区二区三区免费在线看| 7777精品伊人久久久大香线蕉经典版下载| proumb性欧美在线观看| 亚洲国产精品高清| 男男成人高潮片免费网站| 日韩亚洲欧美综合| 久久99国产精品久久99果冻传媒 | 日韩精品乱码av一区二区| 男人的j进女人的j一区| 欧美色电影在线| 国产精品综合久久| 99视频在线精品| 欧美日本乱大交xxxxx| 亚洲成人黄色小说| 久久久久综合网| 欧美日韩一区久久| 国产清纯白嫩初高生在线观看91| 亚洲欧美色综合| 国产高清成人在线| 欧美一区二区三区四区高清| 蜜桃久久久久久久| 国产日韩综合av| 亚洲福利一区二区三区| 成人激情动漫在线观看| 久久嫩草精品久久久精品一| 成人av在线观| 韩国一区二区视频| 欧美日韩国产综合视频在线观看| 亚洲女与黑人做爰| 欧美性欧美巨大黑白大战| 丝袜诱惑亚洲看片| 日韩av在线发布| 粉嫩aⅴ一区二区三区四区 | 国产一区二区三区精品视频| 日韩黄色免费电影| 天堂影院一区二区| 免费久久99精品国产| 欧美日韩激情在线| 国产精品一区一区| 国产一本一道久久香蕉| 一区二区三区.www| 91精品国模一区二区三区| 韩国av一区二区三区在线观看| 亚洲特级片在线| 国产三级一区二区| 日韩理论片在线| av不卡免费在线观看| 麻豆国产一区二区| 日韩国产欧美一区二区三区| 国产婷婷色一区二区三区| 国产精品久久久久桃色tv| 视频精品一区二区| 亚洲男人电影天堂| 国产精品乱码久久久久久| 日韩美女在线视频| 日韩视频在线一区二区| 亚洲中国最大av网站| 欧美午夜精品免费| 欧美日韩一级视频| 欧美一卡二卡在线| 麻豆极品一区二区三区| 国产激情视频一区二区在线观看| 国产精品一区二区在线观看不卡| 亚洲色图另类专区| 亚洲一区二区三区在线播放| 国产乱子伦视频一区二区三区| 国产一区二区三区香蕉| 91精品在线一区二区| 99久久综合狠狠综合久久| 欧美午夜影院一区| 日韩午夜在线影院| 亚洲精品日韩综合观看成人91| 艳妇臀荡乳欲伦亚洲一区| 99久久精品久久久久久清纯| 亚洲大片在线观看| 不卡电影一区二区三区| 欧美日韩国产高清一区二区| 亚洲人成小说网站色在线| 免费的成人av| 日本sm残虐另类| 亚洲国产一区视频| 国产精品国产三级国产aⅴ无密码| 亚洲欧美日韩在线播放| 精品在线你懂的| 欧美色电影在线| 另类专区欧美蜜桃臀第一页| 亚洲高清久久久| 国产日韩综合av| 成人av电影在线| 久久久久88色偷偷免费| 一区二区三区在线播放| 欧美蜜桃一区二区三区| 中文字幕第一区综合| 亚洲欧美日韩小说| 91看片淫黄大片一级| 亚洲视频图片小说| 精品婷婷伊人一区三区三| 激情深爱一区二区| 一本大道久久a久久综合婷婷| 2017欧美狠狠色| 91麻豆产精品久久久久久| 亚洲国产综合色| 欧美主播一区二区三区| 精品一区二区综合| 91精品国产综合久久久久久漫画| 亚洲成av人片在线| 欧美国产欧美综合| 欧美麻豆精品久久久久久| 久久精品亚洲国产奇米99| av在线播放不卡| 亚洲免费电影在线| 欧美一区二区三区男人的天堂| 福利一区在线观看| 综合久久一区二区三区| 欧洲一区二区三区在线| 久久精品国产一区二区三区免费看 | 国产亚洲一二三区| 九色综合国产一区二区三区| 天堂资源在线中文精品| 国产亚洲福利社区一区| 亚洲成av人**亚洲成av**| 中文字幕在线观看一区| 91精品在线免费观看| 高清免费成人av| 久久电影网站中文字幕| 国产精品高清亚洲| 久久久国产午夜精品| 国产三级三级三级精品8ⅰ区| 欧美成人vr18sexvr| 成人av在线网| 色婷婷激情久久| 五月激情六月综合| 亚洲最大色网站| 五月天中文字幕一区二区| 热久久一区二区| 国产精品一线二线三线| 国产91精品在线观看| 国内外成人在线| 免费精品99久久国产综合精品| 亚洲欧洲日本在线| 日韩成人免费电影| 日本视频免费一区| 精品一区二区三区久久| 久久国产欧美日韩精品| 裸体歌舞表演一区二区| 国产精品一二一区| 亚洲成人激情自拍| 蜜芽一区二区三区| 国产盗摄女厕一区二区三区| 国产真实乱子伦精品视频| 成人av在线资源| 欧美不卡123| 亚洲色大成网站www久久九九| 日本中文字幕一区二区有限公司| 久久成人免费电影| 91年精品国产| 欧美性色aⅴ视频一区日韩精品| 日韩精品一区二区三区视频在线观看 | 国产91精品一区二区| av中文字幕一区| 91色在线porny| 欧美国产激情一区二区三区蜜月|