annotate common/util.h @ 0:1158cffe5a5e

Initial import
author David Demelier <markand@malikania.fr>
date Mon, 08 Feb 2016 16:43:14 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * util.h -- some utilities
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef _IRCCD_UTIL_H_
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define _IRCCD_UTIL_H_
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <ctime>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <initializer_list>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <regex>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <sstream>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <string>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <unordered_map>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <vector>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 namespace irccd {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 namespace util {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 * @enum MessageType
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 * @brief Describe which type of message has been received
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 * On channels and queries, you may have a special command or a standard message depending on the
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 * beginning of the message.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 * Example: `!reminder help' may invoke the command event if a plugin reminder exists.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 enum class MessageType {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 Command, //!< special command
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 Message //!< standard message
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 * @brief Combine the type of message and its content.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 using MessagePair = std::pair<std::string, MessageType>;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 * @class Substitution
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 * @brief Used for format() function.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 class Substitution {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 public:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 * Fill that field if you want a date.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 std::time_t time{std::time(nullptr)};
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 * Fill that map if you want to replace keywords.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 std::unordered_map<std::string, std::string> keywords;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 * Format a string and update all templates.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 * Syntax
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 * ======
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 * The syntax is ?{} where ? is replaced by one of the token defined below. Braces are mandatory and cannot be ommited.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 * To write a literal template construct, prepend the token twice.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 * Availables templates
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 * ====================
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 * The following templates are available:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 * - #{name}, name will be substituted from the keywords in params
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 * - ${name}, name will be substituted from the environment variable
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 * - @{attributes}, the attributes will be substituted to IRC colors (see below)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 * - %, any format accepted by strftime(3)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 * Attributes
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 * ==========
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 * The attribute format is composed of three parts, foreground, background and modifiers, each separated by a comma.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 * **Note:** you cannot omit parameters, to specify the background, you must specify the foreground.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 * Examples
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 * ========
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 * Valid constructs
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 * ----------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 * - `#{target}, welcome`: if target is set to "irccd", becomes "irccd, welcome",
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 * - `@{red}#{target}`: if target is specified, it is written in red,
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 * Invalid or literals constructs
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 * ------------------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 * - `##{target}`: will output "#{target}",
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 * - `##`: will output "##",
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 * - `#target`: will output "#target",
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 * - `#{target`: will throw std::invalid_argument.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 * Colors & attributes
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 * -------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 * - `@{red,blue}`: will write text red on blue background,
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 * - `@{default,yellow}`: will write default color text on yellow background
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 * - `@{white,black,bold,underline}`: will write white text on black in both bold and underline
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 std::string format(std::string text, const Substitution &params = {});
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 * Remove leading and trailing spaces.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 * @param str the string
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 * @return the removed white spaces
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 std::string strip(std::string str);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 * Split a string by delimiters.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 * @param list the string to split
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 * @param delimiter a list of delimiters
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 * @param max max number of split
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 * @return a list of string splitted
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 std::vector<std::string> split(const std::string &list, const std::string &delimiters, int max = -1);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
139
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 * Join values by a separator and return a string.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 * @param first the first iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 * @param last the last iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 * @param delim the optional delimiter
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 template <typename InputIt, typename DelimType = char>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 std::string join(InputIt first, InputIt last, DelimType delim = ':')
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 std::ostringstream oss;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
151
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 if (first != last) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 oss << *first;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
154
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 while (++first != last)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 oss << delim << *first;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
158
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 return oss.str();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
161
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 * Convenient overload.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 * @param list the initializer list
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 * @param delim the delimiter
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 * @return the string
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 template <typename T, typename DelimType = char>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 inline std::string join(std::initializer_list<T> list, DelimType delim = ':')
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 return join(list.begin(), list.end(), delim);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
174
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 * Parse IRC message and determine if it's a command or a simple message.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 * @param message the message line
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 * @param commandChar the command char (e.g '!')
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 * @param plugin the plugin name
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 * @return the pair
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 MessagePair parseMessage(std::string message, const std::string &commandChar, const std::string &plugin);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
184
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 * Server and identities must have strict names. This function can
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 * be used to ensure that they are valid.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 * @param name the identifier name
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 * @return true if is valid
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 inline bool isIdentifierValid(const std::string &name)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 return std::regex_match(name, std::regex("[A-Za-z0-9-_]+"));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
196
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 * Check if the value is a boolean, 1, yes and true are accepted.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 * @param value the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 * @return true if is boolean
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 * @note this function is case-insensitive
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 bool isBoolean(std::string value) noexcept;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 * Check if the string is an integer.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 * @param value the input
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 * @param base the optional base
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 * @return true if integer
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 bool isInt(const std::string &value, int base = 10) noexcept;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
214
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 * Check if the string is real.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 * @param value the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 * @return true if real
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 bool isReal(const std::string &value) noexcept;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
222
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 * Check if the string is a number.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 * @param value the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 * @return true if it is a number
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 inline bool isNumber(const std::string &value) noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 return isInt(value) || isReal(value);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
233
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 * Parse a network message from an input buffer and remove it from it.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 * @param input the buffer, will be updated
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 * @return the message or empty string if there is nothing
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 std::string nextNetwork(std::string &input);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
241
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 } // !util
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
243
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 } // !irccd
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
245
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 #endif // !_IRCCD_UTIL_H_