Всеи привет!
Вероятно у кого-то есть готовый быстрый и оттестированный 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
Здравствуйте, PPA, Вы писали:
PPA>Всеи привет!
PPA>Вероятно у кого-то есть готовый быстрый и оттестированный unescape/escape на c/с++
PPA>поделитесь ссылкой?
PPA>хочется оптимизнуть подобный код:
Погугли про конечные автоматы. НА RSDN тоже есть пара статей в соответствующем разделе.
PPA>Что-то Форум не дает записать код в оригинальном виде и сам меняет символы на баксы
PPA>живая функция выглядит так:
Есть тэг [code]
Здравствуйте, 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.