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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gsm_sorted_phonebook.c

?? Gsm手機(短信息,電話簿)開發庫C++源代碼
?? C
字號:
// *************************************************************************
// * GSM TA/ME library
// *
// * File:    gsm_sorted_phonebook.cc
// *
// * Purpose: Alphabetically sorted phonebook
// *          (residing in files or in the ME)
// *
// * Author:  Peter Hofmann (software@pxh.de)
// *
// * Created: 25.6.1999
// *************************************************************************

#ifdef HAVE_CONFIG_H
#include <gsm_config.h>
#endif
#include <gsmlib/gsm_util.h>
#include <gsmlib/gsm_sorted_phonebook.h>
#include <gsmlib/gsm_nls.h>
#include <iostream>
#include <fstream>
#include <limits.h>

const int MAX_LINE_SIZE = 1000;

using namespace std;
using namespace gsmlib;

string SortedPhonebook::escapeString(string s)
{
  string result;
  
  for (const char *pp = s.c_str(); *pp != 0; ++pp)
  {
    if (*pp == CR)
      result += "\\r";
    else if (*pp == LF)
      result += "\\n";
    else if (*pp == '\\')
      result += "\\\\";
    else if (*pp == '|')
      result += "\\|";
    else
      result += *pp;
  }
  return result;
}

string SortedPhonebook::unescapeString(char *line, unsigned int &pos)
{
  string result;
  bool escaped = false;

  while (! (line[pos] == '|' && ! escaped) && line[pos] != 0 &&
         line[pos] != CR && line[pos] != LF)
  {
    if (escaped)
    {
      escaped = false;
      if (line[pos] == 'r')
        result += CR;
      else if (line[pos] == 'n')
        result += LF;
      else if (line[pos] == '\\')
        result += '\\';
      else if (line[pos] == '|')
        result += '|';
      else
        result += line[pos];
    }
    else
      if (line[pos] == '\\')
        escaped = true;
      else
        result += line[pos];

    ++pos;
  }
  return result;
}

void SortedPhonebook::readPhonebookFile(istream &pbs, string filename)
  throw(GsmException)
{
  // read entries
  while (! pbs.eof())
  {
    char line[MAX_LINE_SIZE];
    pbs.getline(line, MAX_LINE_SIZE);

    if (strlen(line) == 0)
      continue;                 // skip empty lines

    if (pbs.bad())
      throw GsmException(stringPrintf(_("error reading from file '%s"),
                                      filename.c_str()),
                         OSError);

    // convert line to newEntry (line format : [index] '|' text '|' number
    string text, telephone;
    unsigned int pos = 0;

    // parse index
    string indexS = unescapeString(line, pos);
    int index = -1;
    if (indexS.length() == 0)
    {
      if (_useIndices)
        throw GsmException(stringPrintf(_("entry '%s' lacks index"), line),
                           ParserError);
    }
    else
    {
      index = checkNumber(indexS);
      _useIndices = true;
    }
    if (line[pos++] != '|')
      throw GsmException(stringPrintf(_("line '%s' has invalid format"), line),
                         ParserError);

    // parse text
    text = unescapeString(line, pos);
    if (line[pos++] != '|')
      throw GsmException(stringPrintf(_("line '%s' has invalid format"), line),
                         ParserError);

    // parse telephone number
    telephone = unescapeString(line, pos);

    insert(PhonebookEntryBase(telephone, text, index));
  }
}

void SortedPhonebook::sync(bool fromDestructor) throw(GsmException)
{
  // if not in file it already is stored in ME/TA
  if (! _fromFile) return;

  // if writing to stdout and not called from destructor ignore
  // (avoids writing to stdout multiple times)
  if (_filename == "" && ! fromDestructor) return;

  // find out if any of the entries have been updated
  if (! _changed)    // only look if we're not writing the file anyway
    for (iterator i = begin(); i != end(); i++)
      if (i->changed())
      {
        _changed = true;
        break;
      }

  if (_changed)
  {
    checkReadonly();
    // create backup file - but only once
    if (! _madeBackupFile && _filename != "") // don't make backup of stdout
    {
      renameToBackupFile(_filename);
      _madeBackupFile = true;
    }

    // open stream
    ostream *pbs = NULL;
    try
    {
      if (_filename == "")
        pbs = &cout;
      else
        pbs = new ofstream(_filename.c_str());
      
      if (pbs->bad())
        throw GsmException(
          stringPrintf(_("error opening file '%s' for writing"),
                       (_filename == "" ? _("<STDOUT>") :
                        _filename.c_str())),
          OSError);
    
      // and write the entries
      for (PhonebookMap::iterator i = _sortedPhonebook.begin();
           i != _sortedPhonebook.end(); ++i)
      {
        // convert entry to output line
        string line =
          (_useIndices ? intToStr(i->second->index()) : "") + "|" +
          escapeString(i->second->text()) + "|" +
          escapeString(i->second->telephone());
      
        // write out the line
        *pbs << line << endl;
        if (pbs->bad())
          throw GsmException(
            stringPrintf(_("error writing to file '%s'"),
                         (_filename == "" ? _("<STDOUT>") :
                          _filename.c_str())),
            OSError);
      }
    }
    catch(GsmException &e)
    {
      if (pbs != &cout) delete pbs;
      throw;
    }
    // close file
    if (pbs != &cout) delete pbs;

    // reset all changed states
    _changed = false;
    for (iterator j = begin(); j != end(); j++)
      j->resetChanged();
  }
}

void SortedPhonebook::checkReadonly() throw(GsmException)
{
  if (_readonly) throw GsmException(
    _("attempt to change phonebook read from <STDIN>"),
    ParameterError);
}

SortedPhonebook::SortedPhonebook(string filename, bool useIndices)
  throw(GsmException) :
  _changed(false), _fromFile(true), _madeBackupFile(false),
  _sortOrder(ByIndex), _useIndices(useIndices), _readonly(false),
  _filename(filename)
{
  // open the file
  ifstream pbs(filename.c_str());
  if (pbs.bad())
    throw GsmException(stringPrintf(_("cannot open file '%s'"),
                                    filename.c_str()),
                       OSError);
  // and read the file
  readPhonebookFile(pbs, filename);
}

SortedPhonebook::SortedPhonebook(bool fromStdin, bool useIndices)
  throw(GsmException) :
  _changed(false), _fromFile(true), _madeBackupFile(false),
  _sortOrder(ByIndex), _useIndices(useIndices), _readonly(fromStdin)
  // _filename is "" - this means stdout
{
  // read from stdin
  if (fromStdin)
    readPhonebookFile(cin, (string)_("<STDIN>"));
}

SortedPhonebook::SortedPhonebook(PhonebookRef mePhonebook)
  throw(GsmException) :
  _changed(false), _fromFile(false), _madeBackupFile(false),
  _sortOrder(ByIndex), _readonly(false), _mePhonebook(mePhonebook)
{
  int entriesRead = 0;
  for (Phonebook::iterator i = _mePhonebook->begin();
       i != _mePhonebook->end(); ++i)
    if (! i->empty())
    {
      _sortedPhonebook.insert(
        PhonebookMap::value_type(PhoneMapKey(*this, lowercase(i->text())), i));
      ++entriesRead;
      if (entriesRead == _mePhonebook->size())
        return;                 // ready
    }
}

void SortedPhonebook::setSortOrder(SortOrder newOrder)
{
  if (newOrder == _sortOrder) return; // nothing to do

  PhonebookMap savedPhonebook = _sortedPhonebook; // save phonebook
  _sortedPhonebook = PhonebookMap(); // empty old phonebook
  _sortOrder = newOrder;

  // re-insert entries
  switch (newOrder)
  {
  case ByTelephone:
  {
    for (PhonebookMap::iterator i = savedPhonebook.begin();
         i != savedPhonebook.end(); ++i)
      _sortedPhonebook.
        insert(PhonebookMap::value_type(
          PhoneMapKey(*this, lowercase(i->second->telephone())), i->second));
    break;
  }
  case ByText:
  {
    for (PhonebookMap::iterator i = savedPhonebook.begin();
         i != savedPhonebook.end(); ++i)
      _sortedPhonebook.
        insert(PhonebookMap::value_type(
          PhoneMapKey(*this, lowercase(i->second->text())), i->second));
    break;
  }
  case ByIndex:
  {
    for (PhonebookMap::iterator i = savedPhonebook.begin();
         i != savedPhonebook.end(); ++i)
      _sortedPhonebook.
        insert(PhonebookMap::value_type(
          PhoneMapKey(*this, i->second->index()), i->second));
    break;
  }
  default:
    assert(0);
    break;
  }
}

unsigned int SortedPhonebook::getMaxTelephoneLen() const
{
  if (_fromFile)
    return UINT_MAX;
  else
    return _mePhonebook->getMaxTelephoneLen();
}

unsigned int SortedPhonebook::getMaxTextLen() const
{
  if (_fromFile)
    return UINT_MAX;
  else
    return _mePhonebook->getMaxTextLen();
}

int SortedPhonebook::max_size() const
{
  if (_fromFile)
    return _sortedPhonebook.max_size();
  else
    return _mePhonebook->max_size();
}

int SortedPhonebook::capacity() const
{
  if (_fromFile)
    return _sortedPhonebook.max_size();
  else
    return _mePhonebook->capacity();
}

SortedPhonebook::iterator
SortedPhonebook::insert(const PhonebookEntryBase& x) throw(GsmException)
{
  checkReadonly();
  _changed = true;
  PhonebookEntryBase *newEntry;

  if (_fromFile)
    if (_useIndices)
    {
      if (x.index() != -1)      // check that index is unique
      {
        for (PhonebookMap::iterator i = _sortedPhonebook.begin();
             i != _sortedPhonebook.end(); ++i)
          if (i->second->index() == x.index())
            throw GsmException(_("indices must be unique in phonebook"),
                               ParameterError);
        newEntry = new PhonebookEntryBase(x);
      }
      else                      // set index
      {
        SortOrder saveSortOrder = _sortOrder;
        setSortOrder(ByIndex);
        int index = 0;
        for (PhonebookMap::iterator i = _sortedPhonebook.begin();
             i != _sortedPhonebook.end(); ++i, ++index)
          if (i->second->index() != index)
            break;
        setSortOrder(saveSortOrder);
        newEntry = new PhonebookEntryBase();
        newEntry->set(x.telephone(), x.text(), index, true);
      }
    }
    else                        // index info in x is ignored
      newEntry = new PhonebookEntryBase(x);
  else
  {
    PhonebookEntry newMEEntry(x);
    newEntry = _mePhonebook->insert((PhonebookEntry*)NULL, newMEEntry);
  }
  switch (_sortOrder)
  {
  case ByTelephone:
    return
      _sortedPhonebook.
      insert(PhonebookMap::value_type(
        PhoneMapKey(*this, lowercase(newEntry->telephone())), newEntry));
  case ByText:
    return
      _sortedPhonebook.
      insert(PhonebookMap::value_type(
        PhoneMapKey(*this, lowercase(newEntry->text())), newEntry));
  case ByIndex:
    return
      _sortedPhonebook.
      insert(PhonebookMap::value_type(
        PhoneMapKey(*this, newEntry->index()), newEntry));
  default:
    assert(0);
    break;
  }
  return SortedPhonebook::iterator();
}

SortedPhonebook::iterator
SortedPhonebook::insert(iterator position, const PhonebookEntryBase& x)
  throw(GsmException)
{
  return insert(x);
}

SortedPhonebook::size_type SortedPhonebook::erase(string &key)
  throw(GsmException)
{
  // deallocate memory or remove from underlying ME phonebook
  for (PhonebookMap::iterator i =
         _sortedPhonebook.find(PhoneMapKey(*this, lowercase(key)));
       i != _sortedPhonebook.end() &&
         i->first == PhoneMapKey(*this, lowercase(key));
       ++i)
  {
    checkReadonly();
    _changed = true;
    if (_fromFile)
      delete i->second;
    else
      _mePhonebook->erase((Phonebook::iterator)i->second);
  }

  return _sortedPhonebook.erase(PhoneMapKey(*this, lowercase(key)));
}

SortedPhonebook::size_type SortedPhonebook::erase(int key)
  throw(GsmException)
{
  // deallocate memory or remove from underlying ME phonebook
  for (PhonebookMap::iterator i =
         _sortedPhonebook.find(PhoneMapKey(*this, key));
       i != _sortedPhonebook.end() && i->first == PhoneMapKey(*this, key);
       ++i)
  {
    checkReadonly();
    _changed = true;
    if (_fromFile)
      delete i->second;
    else
      _mePhonebook->erase((Phonebook::iterator)i->second);
  }

  return _sortedPhonebook.erase(PhoneMapKey(*this, key));
}

void SortedPhonebook::erase(iterator position)
  throw(GsmException)
{
  checkReadonly();
  _changed = true;
  // deallocate memory or remove from underlying ME phonebook
  if (_fromFile)
    delete ((PhonebookMap::iterator)position)->second;
  else
    _mePhonebook->erase((Phonebook::iterator)
                        ((PhonebookMap::iterator)position)->second);
  _sortedPhonebook.erase(position);
}

void SortedPhonebook::erase(iterator first, iterator last)
  throw(GsmException)
{
  checkReadonly();
  _changed = true;
  for (PhonebookMap::iterator i = first; i != last; ++i)
    if (_fromFile)
      delete i->second;
    else
      _mePhonebook->erase((Phonebook::iterator)i->second);
  _sortedPhonebook.erase(first, last);
}

void SortedPhonebook::clear() throw(GsmException)
{
  checkReadonly();
  _changed = true;
  for (iterator i = begin(); i != end(); i++)
    erase(i);
}

SortedPhonebook::~SortedPhonebook()
{
  if (_fromFile)
  {
    sync(true);
    for (PhonebookMap::iterator i = _sortedPhonebook.begin();
         i != _sortedPhonebook.end(); ++i)
      delete i->second;
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲1区2区3区4区| 日本不卡的三区四区五区| 51精品久久久久久久蜜臀| 国产成人综合网站| 日韩制服丝袜av| 亚洲欧洲精品一区二区精品久久久| 欧美日韩国产免费一区二区 | 午夜精品爽啪视频| 国产午夜精品在线观看| 欧美一区二区三区视频免费| 99这里只有久久精品视频| 久久99精品久久久久久动态图 | 亚洲欧洲成人精品av97| 日韩视频不卡中文| 欧美性videosxxxxx| 不卡视频在线看| 国产一区在线观看视频| 青青草97国产精品免费观看无弹窗版| 国产精品大尺度| 国产喂奶挤奶一区二区三区| 日韩免费福利电影在线观看| 欧美日韩视频在线一区二区| 色悠悠亚洲一区二区| 国产成人在线视频网站| 国产一区二区视频在线播放| 美女尤物国产一区| 日本视频一区二区三区| 亚洲成人黄色影院| 一区二区三区电影在线播| 最新热久久免费视频| 国产欧美一区二区精品忘忧草 | 日韩精品影音先锋| 在线播放91灌醉迷j高跟美女 | 欧美亚洲动漫精品| 色综合久久综合中文综合网| 国产成人精品免费视频网站| 国内外成人在线视频| 精品一区二区三区在线播放视频 | 天堂成人免费av电影一区| 亚洲午夜久久久久久久久电影网| 一区二区视频在线看| 亚洲激情五月婷婷| 亚洲综合成人在线视频| 人人超碰91尤物精品国产| 亚洲国产精品久久久男人的天堂| 亚洲乱码国产乱码精品精小说| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 久久久国产精华| 中文字幕欧美日韩一区| 欧美激情中文不卡| 国产精品白丝在线| 亚洲女子a中天字幕| 亚洲欧美一区二区三区国产精品| 亚洲欧美一区二区久久| 亚洲国产精品久久久久秋霞影院 | 日韩成人dvd| 九九九精品视频| 国产精品99久| eeuss鲁片一区二区三区| 色婷婷久久久亚洲一区二区三区 | 99精品视频在线免费观看| av欧美精品.com| 欧美亚洲动漫精品| 欧美一级日韩一级| 久久九九国产精品| 亚洲人吸女人奶水| 日韩中文字幕一区二区三区| 久久国产精品一区二区| 国产精品一区2区| 色婷婷av一区| 欧美大度的电影原声| 欧美激情艳妇裸体舞| 国产精品污www在线观看| 一区二区三区四区国产精品| 日韩中文字幕区一区有砖一区 | 亚洲猫色日本管| 日韩国产欧美在线播放| 国产一区二区免费视频| 91丨九色丨蝌蚪富婆spa| 欧美日韩高清在线播放| 久久综合色8888| 亚洲精品视频在线| 久久国产乱子精品免费女| 99精品视频一区二区| 4438亚洲最大| 最新欧美精品一区二区三区| 奇米影视7777精品一区二区| 9人人澡人人爽人人精品| 欧美一区二区视频观看视频| 亚洲欧洲三级电影| 免费高清成人在线| 99久久综合精品| 欧美mv日韩mv| 亚洲最新在线观看| 成人国产电影网| 欧美一级黄色录像| 亚洲精品视频自拍| 成年人网站91| www一区二区| 香蕉久久一区二区不卡无毒影院| 国产不卡高清在线观看视频| 制服丝袜中文字幕一区| 亚洲三级免费观看| 国产一区二区三区香蕉| 欧美男男青年gay1069videost| 亚洲国产激情av| 美女一区二区视频| 欧美日韩在线一区二区| 中文字幕一区三区| 国产精品一区二区久久不卡| 3atv一区二区三区| 亚洲一区二区欧美激情| 99精品热视频| 欧美激情综合在线| 久久99热国产| 4438成人网| 夜夜嗨av一区二区三区网页| 99国产精品久久久久久久久久久 | 欧美天天综合网| 亚洲欧美激情插| 99国内精品久久| 国产精品日日摸夜夜摸av| 国产精品一卡二卡| 2020国产成人综合网| 免费看日韩精品| 欧美高清hd18日本| 亚洲国产视频在线| 91福利在线观看| 亚洲一二三级电影| 欧日韩精品视频| 亚洲自拍偷拍九九九| 色屁屁一区二区| 亚洲天堂a在线| 91在线视频免费观看| 最好看的中文字幕久久| 成人午夜电影小说| 国产精品麻豆网站| 成人av电影在线网| 国产精品三级视频| 91色在线porny| 亚洲一区在线观看免费| 欧美色窝79yyyycom| 亚洲18女电影在线观看| 欧美精品在线观看播放| 蜜桃视频在线观看一区二区| 欧美一级艳片视频免费观看| 伦理电影国产精品| 欧美成人a∨高清免费观看| 精品影院一区二区久久久| 欧美精品一区二区三区蜜桃| 国产成人综合在线播放| 亚洲欧美在线观看| 色婷婷久久久亚洲一区二区三区| 亚洲国产精品久久久久婷婷884| 7777精品伊人久久久大香线蕉超级流畅 | 精品sm在线观看| 国产一区二区三区视频在线播放| 精品对白一区国产伦| 国产99一区视频免费| 亚洲乱码精品一二三四区日韩在线| 欧美自拍丝袜亚洲| 美女网站一区二区| 国产调教视频一区| 91麻豆国产在线观看| 亚洲国产精品自拍| 久久综合久久综合九色| 9人人澡人人爽人人精品| 亚洲国产精品一区二区久久 | 亚洲午夜三级在线| 日韩欧美一区二区在线视频| 大陆成人av片| 亚洲国产成人tv| 久久综合国产精品| 91看片淫黄大片一级在线观看| 三级不卡在线观看| 国产精品私人影院| 欧美日韩国产在线播放网站| 国产综合久久久久久久久久久久| 综合久久国产九一剧情麻豆| 9191成人精品久久| 欧美日韩国产高清一区| 国产精品小仙女| 午夜电影网一区| 欧美高清一级片在线观看| 欧美电影一区二区三区| 成人午夜又粗又硬又大| 天天免费综合色| 亚洲少妇中出一区| 欧美精品一区二区三区一线天视频 | 狠狠色丁香久久婷婷综合_中 | 制服丝袜亚洲色图| 粉嫩在线一区二区三区视频| 三级欧美在线一区| 亚洲视频在线观看三级| 欧美精品一区男女天堂| 欧美三级韩国三级日本一级| 成人激情校园春色| 久久国产精品色婷婷| 午夜精品久久久久影视| 亚洲欧洲在线观看av|