1+ /* *
2+ * @file ChaiScript String Methods
3+ *
4+ * Adds some additional string methods to ChaiScript strings.
5+ *
6+ * string::replace(string search, string replace)
7+ * string::replace(char search, char replace)
8+ * string::trim()
9+ * string::split(string token)
10+ * string::toLowerCase()
11+ * string::toUpperCase()
12+ */
13+ #include < algorithm>
114#include < string>
215#include < vector>
316
@@ -8,53 +21,73 @@ namespace chaiscript {
821 namespace string_methods {
922 ModulePtr bootstrap (ModulePtr m = std::make_shared<Module>())
1023 {
11- // string::replace(std::string search, std::string replace)
12- chai.add (fun ([](const std::string& subject, const std::string& search, const std::string& replace) {
13- std::string result (subject);
14- size_t pos = 0 ;
15- while ((pos = result.find (search, pos)) != std::string::npos) {
16- result.replace (pos, search.length (), replace);
17- pos += replace.length ();
18- }
19- return result;
20- }), " replace" );
21-
22- // string::replace(char, char)
23- m->add (fun ([](const std::string& subject, char search, char replace) {
24- std::string result (subject);
25- std::replace (result.begin (), result.end (), search, replace);
26- return result;
27- }), " replace" );
28-
29-
30- // string::trim()
31- m->add (fun ([](const std::string& subject) {
32- std::string result (subject);
33- std::string chars = " \t\n\v\f\r " ;
34- result.erase (0 , result.find_first_not_of (chars));
35- result.erase (0 , result.find_last_not_of (chars));
36- return result;
37- }), " trim" );
38-
39- // string::split()
40- m->add (fun ([](const std::string& subject, const std::string& token) {
41- std::string str (subject);
42- std::vector<std::string> result;
43- while (str.size ()) {
44- int index = str.find (token);
45- if (index != std::string::npos) {
46- result.push_back (str.substr (0 , index));
47- str = str.substr (index + token.size ());
48- if (str.size () == 0 ) {
49- result.push_back (str);
50- }
51- } else {
52- result.push_back (str);
53- str = " " ;
54- }
55- }
56- return result;
57- }), " split" );
24+ // Add lists of strings.
25+ m->add (bootstrap::standard_library::vector_type<std::vector<std::string>>(" StringVector" ));
26+
27+ // string::replace(std::string search, std::string replace)
28+ m->add (fun ([](const std::string& subject, const std::string& search, const std::string& replace) {
29+ std::string result (subject);
30+ size_t pos = 0 ;
31+ while ((pos = result.find (search, pos)) != std::string::npos) {
32+ result.replace (pos, search.length (), replace);
33+ pos += replace.length ();
34+ }
35+ return result;
36+ }), " replace" );
37+
38+ // string::replace(char, char)
39+ m->add (fun ([](const std::string& subject, char search, char replace) {
40+ std::string result (subject);
41+ std::replace (result.begin (), result.end (), search, replace);
42+ return result;
43+ }), " replace" );
44+
45+ // string::trim()
46+ m->add (fun ([](const std::string& subject) {
47+ std::string result (subject);
48+ std::string chars = " \t\n\v\f\r " ;
49+ result.erase (0 , result.find_first_not_of (chars));
50+ result.erase (0 , result.find_last_not_of (chars));
51+ return result;
52+ }), " trim" );
53+
54+ // string::split(string)
55+ m->add (fun ([](const std::string& subject, const std::string& token) {
56+ std::string str (subject);
57+ std::vector<std::string> result;
58+ while (str.size ()) {
59+ size_t index = str.find (token);
60+ if (index != std::string::npos) {
61+ result.push_back (str.substr (0 , index));
62+ str = str.substr (index + token.size ());
63+ if (str.size () == 0 ) {
64+ result.push_back (str);
65+ }
66+ } else {
67+ result.push_back (str);
68+ str = " " ;
69+ }
70+ }
71+ return result;
72+ }), " split" );
73+
74+ // string::toLowerCase()
75+ m->add (fun ([](const std::string& subject) {
76+ std::string result (subject);
77+ std::transform (result.begin (), result.end (), result.begin (), [](unsigned char c) {
78+ return std::tolower (c);
79+ });
80+ return result;
81+ }), " toLowerCase" );
82+
83+ // string::toUpperCase
84+ m->add (fun ([](const std::string& subject) {
85+ std::string result (subject);
86+ std::transform (result.begin (), result.end (), result.begin (), [](unsigned char c) {
87+ return std::toupper (c);
88+ });
89+ return result;
90+ }), " toUpperCase" );
5891
5992 return m;
6093 }
0 commit comments