Goby3 3.2.3
2025.05.13
Loading...
Searching...
No Matches
moos_string.h
Go to the documentation of this file.
1// Copyright 2010-2021:
2// GobySoft, LLC (2013-)
3// Massachusetts Institute of Technology (2007-2014)
4// Community contributors (see AUTHORS file)
5// File authors:
6// Toby Schneider <toby@gobysoft.org>
7//
8//
9// This file is part of the Goby Underwater Autonomy Project Libraries
10// ("The Goby Libraries").
11//
12// The Goby Libraries are free software: you can redistribute them and/or modify
13// them under the terms of the GNU Lesser General Public License as published by
14// the Free Software Foundation, either version 2.1 of the License, or
15// (at your option) any later version.
16//
17// The Goby Libraries are distributed in the hope that they will be useful,
18// but WITHOUT ANY WARRANTY; without even the implied warranty of
19// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20// GNU Lesser General Public License for more details.
21//
22// You should have received a copy of the GNU Lesser General Public License
23// along with Goby. If not, see <http://www.gnu.org/licenses/>.
24
25#ifndef GOBY_MOOS_MOOS_STRING_H
26#define GOBY_MOOS_MOOS_STRING_H
27
29
30#include "goby/time.h"
31#include "goby/util/as.h"
32
33namespace goby
34{
35namespace moos
36{
37inline std::ostream& operator<<(std::ostream& os, const CMOOSMsg& msg)
38{
39 os << "[[CMOOSMsg]]"
40 << " Key: " << msg.GetKey() << " Type: " << (msg.IsDouble() ? "double" : "string")
41 << " Value: "
42 << (msg.IsDouble() ? goby::util::as<std::string>(msg.GetDouble()) : msg.GetString())
43 << " Time: "
44 << time::convert<boost::posix_time::ptime>(msg.GetTime() * boost::units::si::seconds)
45 << " Community: " << msg.GetCommunity()
46 << " Source: " << msg.m_sSrc // no getter in CMOOSMsg!!!
47 << " Source Aux: " << msg.GetSourceAux();
48 return os;
49}
50
60inline bool val_from_string(std::string& out, const std::string& str, const std::string& key)
61{
62 // str: foo=1,bar={2,3,4,5},pig=3,cow=yes
63 // two cases:
64 // key: bar
65 // key: pig
66
67 out.erase();
68
69 // deal with foo=bar,o=bar problem when looking for "o=" since
70 // o is contained in foo
71
72 // ok: beginning of string, end of string, comma right before start_pos
73 int match = 0;
74 std::string::size_type start_pos = 0;
75 while (match == 0 ||
76 !(start_pos == 0 || start_pos == std::string::npos || str[start_pos - 1] == ','))
77 {
78 // str: foo=1,bar={2,3,4,5},pig=3,cow=yes
79 // start_pos ^ ^
80 boost::iterator_range<std::string::const_iterator> result =
81 boost::ifind_nth(str, std::string(key + "="), match);
82 start_pos = (result) ? result.begin() - str.begin() : std::string::npos;
83 ++match;
84 }
85
86 if (start_pos != std::string::npos)
87 {
88 // chopped: bar={2,3,4,5},pig=3,cow=yes
89 // chopped: pig=3,cow=yes
90 std::string chopped = str.substr(start_pos);
91
92 // chopped: bar={2,3,4,5},pig=3,cow=yes
93 // equal_pos ^
94 // chopped: pig=3,cow=yes
95 // equal_pos ^
96 std::string::size_type equal_pos = chopped.find("=");
97
98 // check for array
99 bool is_array = (equal_pos + 1 < chopped.length() && chopped[equal_pos + 1] == '{');
100
101 if (equal_pos != std::string::npos)
102 {
103 // chopped_twice: ={2,3,4,5},pig=3,cow=yes
104 // chopped_twice: =pig=3,cow=yes
105 std::string chopped_twice = chopped.substr(equal_pos);
106
107 // chopped_twice: ={2,3,4,5},pig=3,cow=yes
108 // end_pos ^
109 // chopped_twice: =pig=3,cow=yes
110 // end_pos ^
111 std::string::size_type end_pos =
112 (is_array) ? chopped_twice.find("}") : chopped_twice.find(",");
113
114 // out: 2,3,4,5
115 // out: 3
116 out = (is_array) ? chopped_twice.substr(2, end_pos - 2)
117 : chopped_twice.substr(1, end_pos - 1);
118
119 return true;
120 }
121 }
122
123 return false;
124}
125
128template <typename T>
129inline bool val_from_string(T& out, const std::string& str, const std::string& key)
130{
131 std::string s;
132 if (!val_from_string(s, str, key))
133 return false;
134
135 try
136 {
137 out = boost::lexical_cast<T>(s);
138 }
139 catch (boost::bad_lexical_cast&)
140 {
141 return false;
142 }
143
144 return true;
145}
146
148inline bool val_from_string(bool& out, const std::string& str, const std::string& key)
149{
150 std::string s;
151 if (!val_from_string(s, str, key))
152 return false;
153
154 out = goby::util::as<bool>(s);
155 return true;
156}
158
160inline void stripblanks(std::string& s)
161{
162 for (std::string::iterator it = s.end() - 1; it != s.begin() - 1; --it)
163 {
164 if (isspace(*it))
165 s.erase(it);
166 }
167}
168} // namespace moos
169} // namespace goby
170
171#endif
bool val_from_string(std::string &out, const std::string &str, const std::string &key)
Definition moos_string.h:60
void stripblanks(std::string &s)
remove all blanks from string s
The global namespace for the Goby project.
extern ::PROTOBUF_NAMESPACE_ID::internal::ExtensionIdentifier< ::PROTOBUF_NAMESPACE_ID::MessageOptions, ::PROTOBUF_NAMESPACE_ID::internal::MessageTypeTraits< ::goby::GobyMessageOptions >, 11, false > msg