loom

Форк
0
/
replaceAll.cpp 
91 строка · 2.4 Кб
1
/*
2
MIT License
3

4
Copyright (c) 2021 МГТУ им. Н.Э. Баумана, кафедра ИУ-6, Михаил Фетисов,
5

6
https://bmstu.codes/lsx/simodo
7
*/
8

9
#include "simodo/inout/convert/functions.h"
10

11
namespace simodo::inout
12
{
13

14
void replaceAll(std::u16string &str, const std::u16string &from, const std::u16string &to)
15
{
16
    if(from.empty())
17
        return;
18

19
    size_t start_pos = 0;
20
    while((start_pos = str.find(from, start_pos)) != std::string::npos)
21
    {
22
        str.replace(start_pos, from.length(), to);
23
        start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
24
    }
25
}
26

27
std::u16string replace(const std::u16string &str, const std::u16string &from, const std::u16string &to)
28
{
29
    if(from.empty())
30
        return str;
31

32
    std::u16string res;
33
    res.reserve(str.size() * 2);
34

35
    size_t start_pos = 0;
36
    size_t pos = 0;
37
    while((pos = str.find(from, start_pos)) != std::string::npos)
38
    {
39
        size_t target_pos = res.size();
40
        res.resize(res.size()+pos-start_pos+to.size());
41
        str.copy(res.data()+target_pos,pos-start_pos,start_pos);
42
        to.copy(res.data()+target_pos+pos-start_pos,to.size());
43
        start_pos = pos + from.length();
44
    }
45
    size_t target_pos = res.size();
46
    res.resize(res.size()+str.size()-start_pos);
47
    str.copy(res.data()+target_pos,str.size()-start_pos,start_pos);
48

49
    return res;
50
}
51

52
std::u16string encodeSpecialChars(const std::u16string & text)
53
{
54
    return replace(replace(text, u"\n", u"
"), u"\"", u""");
55
}
56

57
std::u16string decodeSpecialChars(const std::u16string & text)
58
{
59
    return replace(replace(text, u"
", u"\n"), u""", u"\"");
60
}
61

62
void replaceAll(std::string &str, const std::string &from, const std::string &to)
63
{
64
    if(from.empty())
65
        return;
66

67
    size_t start_pos = 0;
68
    while((start_pos = str.find(from, start_pos)) != std::string::npos)
69
    {
70
        str.replace(start_pos, from.length(), to);
71
        start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
72
    }
73
}
74

75
std::string encodeSpecialChars(const std::string & text)
76
{
77
    std::string res = text;
78
    replaceAll(res, "\n", "
");
79
    replaceAll(res, "\"", """);
80
    return res;
81
}
82

83
std::string decodeSpecialChars(const std::string & text)
84
{
85
    std::string res = text;
86
    replaceAll(res, """, "\"");
87
    replaceAll(res, "
", "\n");
88
    return res;
89
}
90

91
}
92

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.