Оптимальный unescape
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 18.10.14 07:01
Оценка:
Всеи привет!
Вероятно у кого-то есть готовый быстрый и оттестированный unescape/escape на c/с++
поделитесь ссылкой?
хочется оптимизнуть подобный код:
        while( (i = tmp.find("$", i)) != string::npos) {
            tmp.replace(i, 5, "$");
            i++;
        }
        i = 0;
        while( (i = tmp.find("|", i)) != string::npos) {
            tmp.replace(i, 6, "|");
            i++;
        }
        i = 0;
        while( (i = tmp.find("&", i)) != string::npos) {
            tmp.replace(i, 5, "&");
            i++;
        }

p.s.
Что-то Форум не дает записать код в оригинальном виде и сам меняет символы на баксы
живая функция выглядит так:

https://github.com/pavel-pimenov/flylinkdc-r5xx/blob/0f1c695e8a7ba787e6010ffe71cbbda32af607ce/client/nmdchub.cpp#L1608
Отредактировано 20.10.2014 8:49 Кодт . Предыдущая версия . Еще …
Отредактировано 18.10.2014 7:05 PPA . Предыдущая версия .
Отредактировано 18.10.2014 7:04 PPA . Предыдущая версия .
Отредактировано 18.10.2014 7:03 PPA . Предыдущая версия .
Отредактировано 18.10.2014 7:03 PPA . Предыдущая версия .
Отредактировано 18.10.2014 7:02 PPA . Предыдущая версия .
Re: Оптимальный unescape
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 18.10.14 07:20
Оценка:
Здравствуйте, PPA, Вы писали:

PPA>Всеи привет!

PPA>Вероятно у кого-то есть готовый быстрый и оттестированный unescape/escape на c/с++
PPA>поделитесь ссылкой?
PPA>хочется оптимизнуть подобный код:

Погугли про конечные автоматы. НА RSDN тоже есть пара статей в соответствующем разделе.

PPA>Что-то Форум не дает записать код в оригинальном виде и сам меняет символы на баксы

PPA>живая функция выглядит так:

Есть тэг [code]
Маньяк Робокряк колесит по городу
Re: Оптимальный unescape
От: Хон Гиль Дон Россия  
Дата: 18.10.14 13:53
Оценка:
Здравствуйте, PPA, Вы писали:

PPA>Всеи привет!

PPA>Вероятно у кого-то есть готовый быстрый и оттестированный unescape/escape на c/с++
PPA>поделитесь ссылкой?
PPA>хочется оптимизнуть подобный код:

PPA> while( (i = tmp.find("$", i)) != string::npos) {

PPA> tmp.replace(i, 5, "$");
PPA> i++;
PPA> }
PPA> i = 0;
PPA> while( (i = tmp.find("|", i)) != string::npos) {
PPA> tmp.replace(i, 6, "|");
PPA> i++;
PPA> }
PPA> i = 0;
PPA> while( (i = tmp.find("&", i)) != string::npos) {
PPA> tmp.replace(i, 5, "&");
PPA> i++;
PPA> }
PPA>p.s.
PPA>Что-то Форум не дает записать код в оригинальном виде и сам меняет символы на баксы
PPA>живая функция выглядит так:

Если результат нужно писать в исходный же контейнер и на неправильные эскейпы ругаться не требуется, то я бы изобразил чего-нибудь примерно так:
template <class Iter> match_str(char const *cmp, Iter &first, Iter last)
{
  Iter cur = first;
  for (; *cmp && cur != last; ++cmp, ++cur)
  {
    if (*cmp != *cur)
      break;
  }
  if (*cmp)
    return false;
  first = cur;
  return true;
}

template <int Char, class Iter> Iter unescape(Iter first, Iter last)
{
  Iter o = first;
  while (first != last)
  {
    if (*first == '&')
    {
      if (++first == last)
        return;
      if (match_str("#36;", first, last))
      {
        *o = '$';
      } else if (match_str("#124;", first, last))
      {
        *o = '|';
      } else if (match_str("amp;", first, last))
      {
        *o = '&';
      } else
      {
        *o = *first;
        ++first;
      }
    } else
    {
      *o = first;
      ++first;
    }
    ++o;
  }
  return o;
}


Естественно, код не отлаженный и даже не компилировался.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Оптимальный unescape
От: BulatZiganshin  
Дата: 18.10.14 18:14
Оценка:
Здравствуйте, PPA, Вы писали:

PPA>хочется оптимизнуть подобный код:


для скорости думаю лучше всего будет использовать 4-байтные сравнения с маскировкой лишних байт, типа

if( (*(int32*)a & 0xFFFF) == '&'+'a'*256)
Люди, я люблю вас! Будьте бдительны!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.