From 7cb97719620a1db1810547cd281481ffc1c9e7d3 Mon Sep 17 00:00:00 2001 From: Martin Piatka Date: Tue, 25 Oct 2022 16:04:44 +0200 Subject: [PATCH] Move tokenize and sv_parse_num into string_view_utils --- Makefile.in | 1 + src/audio/audio.cpp | 2 +- src/audio/filter/delay.cpp | 2 +- src/audio/filter/playback.cpp | 2 +- src/audio/filter_chain.cpp | 2 +- src/audio/resampler.cpp | 2 +- src/capture_filter/preview.cpp | 2 +- src/debug.cpp | 2 +- src/utils/misc.cpp | 34 ---------------- src/utils/misc.h | 21 ---------- src/utils/string_view_utils.cpp | 35 ++++++++++++++++ ...sv_parse_num.hpp => string_view_utils.hpp} | 40 ++++++++++++++----- src/video_display/conference.cpp | 2 +- src/video_display/multiplier.cpp | 2 +- src/video_display/rpi4_out.cpp | 2 +- src/video_display/unix_sock.cpp | 2 +- 16 files changed, 77 insertions(+), 76 deletions(-) create mode 100644 src/utils/string_view_utils.cpp rename src/utils/{sv_parse_num.hpp => string_view_utils.hpp} (84%) diff --git a/Makefile.in b/Makefile.in index d3fc1bd25..9f23c16be 100644 --- a/Makefile.in +++ b/Makefile.in @@ -168,6 +168,7 @@ COMMON_OBJS = \ src/utils/jpeg_reader.o \ src/utils/list.o \ src/utils/misc.o \ + src/utils/string_view_utils.o \ src/utils/nat.o \ src/utils/net.o \ src/utils/packet_counter.o \ diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index e208b6f34..6c3379c0a 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -94,7 +94,7 @@ #include "utils/net.h" #include "utils/thread.h" #include "utils/worker.h" -#include "utils/misc.h" +#include "utils/string_view_utils.hpp" using namespace std; using rang::fg; diff --git a/src/audio/filter/delay.cpp b/src/audio/filter/delay.cpp index 73eab7110..59343356c 100644 --- a/src/audio/filter/delay.cpp +++ b/src/audio/filter/delay.cpp @@ -51,7 +51,7 @@ #include "lib_common.h" #include "utils/ring_buffer.h" #include "utils/misc.h" -#include "utils/sv_parse_num.hpp" +#include "utils/string_view_utils.hpp" namespace{ struct Ring_buf_deleter{ diff --git a/src/audio/filter/playback.cpp b/src/audio/filter/playback.cpp index 54ded8342..9ea40ed2f 100644 --- a/src/audio/filter/playback.cpp +++ b/src/audio/filter/playback.cpp @@ -50,7 +50,7 @@ #include "audio/types.h" #include "audio/audio_playback.h" #include "lib_common.h" -#include "utils/misc.h" +#include "utils/string_view_utils.hpp" namespace{ struct Playback_dev_deleter{ void operator()(state_audio_playback *p){ audio_playback_done(p); } }; diff --git a/src/audio/filter_chain.cpp b/src/audio/filter_chain.cpp index 10b537f10..e4f3ac2ed 100644 --- a/src/audio/filter_chain.cpp +++ b/src/audio/filter_chain.cpp @@ -43,7 +43,7 @@ #include "debug.h" #include "audio/types.h" #include "filter_chain.hpp" -#include "utils/misc.h" +#include "utils/string_view_utils.hpp" Filter_chain::Filter_chain(struct module *parent) : mod(MODULE_CLASS_FILTER, parent, this) { } diff --git a/src/audio/resampler.cpp b/src/audio/resampler.cpp index ceb60940e..7cc5d9dff 100644 --- a/src/audio/resampler.cpp +++ b/src/audio/resampler.cpp @@ -49,7 +49,7 @@ #include "host.h" #include "ug_runtime_error.hpp" #include "utils/macros.h" -#include "utils/misc.h" +#include "utils/string_view_utils.hpp" #include "utils/worker.h" #ifdef HAVE_SPEEXDSP diff --git a/src/capture_filter/preview.cpp b/src/capture_filter/preview.cpp index 1c4900298..820604768 100644 --- a/src/capture_filter/preview.cpp +++ b/src/capture_filter/preview.cpp @@ -56,7 +56,7 @@ #include "utils/fs.h" #include "utils/misc.h" #include "utils/macros.h" -#include "utils/sv_parse_num.hpp" +#include "utils/string_view_utils.hpp" #include "video.h" #include "video_codec.h" #include "tools/ipc_frame.h" diff --git a/src/debug.cpp b/src/debug.cpp index f05c74f5f..c8394f647 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -58,7 +58,7 @@ #include "debug.h" #include "host.h" #include "utils/color_out.h" -#include "utils/sv_parse_num.hpp" +#include "utils/string_view_utils.hpp" #include "utils/misc.h" // ug_strerror using std::string; diff --git a/src/utils/misc.cpp b/src/utils/misc.cpp index 7c03cd942..289420318 100644 --- a/src/utils/misc.cpp +++ b/src/utils/misc.cpp @@ -230,40 +230,6 @@ int get_cpu_core_count(void) #endif } -std::string_view tokenize(std::string_view& str, char delim, char quot){ - if(str.empty()) - return {}; - - bool escaped = false; - - auto token_begin = str.begin(); - while(token_begin != str.end()){ - if(*token_begin == quot) - escaped = !escaped; - else if(*token_begin != delim) - break; - - token_begin++; - } - - auto token_end = token_begin; - while(token_end != str.end()){ - if(*token_end == quot){ - str = std::string_view(token_end, str.end() - token_end); - str.remove_prefix(1); //remove the end quote - return std::string_view(token_begin, token_end - token_begin); - } - else if(*token_end == delim && !escaped) - break; - - token_end++; - } - - str = std::string_view(token_end, str.end() - token_end); - - return std::string_view(token_begin, token_end - token_begin); -} - /** * Prints module usage in unified format. * diff --git a/src/utils/misc.h b/src/utils/misc.h index 537aa1467..cf7cd0513 100644 --- a/src/utils/misc.h +++ b/src/utils/misc.h @@ -77,27 +77,6 @@ void print_module_usage(const char *module_name, const struct key_val *options, uint32_t parse_uint32(const char *value_str) noexcept(false); #include -#include - -/** - * @brief Tokenizer for string_view - * - * Useful for non-destructive tokenization of strings. Skips empty tokens. - * str is modified to view the not yet processed remainder. - * - * Typical usage (prints lines "Hello", "World", "!"): - * ~~~~~~~~~~~~~~~~~~~{.cpp} - * std::string_view sv = ":::Hello:World::!::"; - * while(!sv.empty()){ - * cout << tokenize(sv, ':') << "\n"; - * } - * ~~~~~~~~~~~~~~~~~~~ - * - * The 'quot' param allows for a basic quotation based deilimiter escape, - * however the whole token must be escaped. - * i.e. sync:"opts=a=1:b=2":fs is fine, but sync:opts="a=1:b=2":fs is not. - */ -std::string_view tokenize(std::string_view& str, char delim, char quot = '\0'); template struct ref_count_init_once { std::optional operator()(T (*init)(void), int &i) { diff --git a/src/utils/string_view_utils.cpp b/src/utils/string_view_utils.cpp new file mode 100644 index 000000000..9c84d8c32 --- /dev/null +++ b/src/utils/string_view_utils.cpp @@ -0,0 +1,35 @@ +#include "string_view_utils.hpp" + +std::string_view tokenize(std::string_view& str, char delim, char quot){ + if(str.empty()) + return {}; + + bool escaped = false; + + auto token_begin = str.begin(); + while(token_begin != str.end()){ + if(*token_begin == quot) + escaped = !escaped; + else if(*token_begin != delim) + break; + + token_begin++; + } + + auto token_end = token_begin; + while(token_end != str.end()){ + if(*token_end == quot){ + str = std::string_view(token_end, str.end() - token_end); + str.remove_prefix(1); //remove the end quote + return std::string_view(token_begin, token_end - token_begin); + } + else if(*token_end == delim && !escaped) + break; + + token_end++; + } + + str = std::string_view(token_end, str.end() - token_end); + + return std::string_view(token_begin, token_end - token_begin); +} diff --git a/src/utils/sv_parse_num.hpp b/src/utils/string_view_utils.hpp similarity index 84% rename from src/utils/sv_parse_num.hpp rename to src/utils/string_view_utils.hpp index 2c5483993..212b55792 100644 --- a/src/utils/sv_parse_num.hpp +++ b/src/utils/string_view_utils.hpp @@ -1,5 +1,5 @@ /** - * @file utils/sv_parse_num.hpp + * @file utils/string_view_utils.hpp * @author Martin Piatka */ /* @@ -35,8 +35,35 @@ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef UTILS_SV_PARSE_NUM_HPP_ -#define UTILS_SV_PARSE_NUM_HPP_ +#ifndef STRING_VIEW_UTILS_183e2da27fe9 +#define STRING_VIEW_UTILS_183e2da27fe9 + +#include +#include +#include +#include +#include + +/** + * @brief Tokenizer for string_view + * + * Useful for non-destructive tokenization of strings. Skips empty tokens. + * str is modified to view the not yet processed remainder. + * + * Typical usage (prints lines "Hello", "World", "!"): + * ~~~~~~~~~~~~~~~~~~~{.cpp} + * std::string_view sv = ":::Hello:World::!::"; + * while(!sv.empty()){ + * cout << tokenize(sv, ':') << "\n"; + * } + * ~~~~~~~~~~~~~~~~~~~ + * + * The 'quot' param allows for a basic quotation based deilimiter escape, + * however the whole token must be escaped. + * i.e. sync:"opts=a=1:b=2":fs is fine, but sync:opts="a=1:b=2":fs is not. + */ +std::string_view tokenize(std::string_view& str, char delim, char quot = '\0'); + /* std::from_chars is c++17, but on major compilers the feature was missing or * partial (no floating point support). This header provides safe fallbacks @@ -46,13 +73,6 @@ * GCC - partial since v8, floating since v11 * Clang - partial since 7 */ - -#include -#include -#include -#include -#include - #if __has_include() #include diff --git a/src/video_display/conference.cpp b/src/video_display/conference.cpp index b9f008670..a5ae0f6d1 100644 --- a/src/video_display/conference.cpp +++ b/src/video_display/conference.cpp @@ -47,7 +47,7 @@ #include "video_codec.h" #include "module.h" #include "utils/misc.h" -#include "utils/sv_parse_num.hpp" +#include "utils/string_view_utils.hpp" #include #include diff --git a/src/video_display/multiplier.cpp b/src/video_display/multiplier.cpp index da07bf861..ffaa49246 100644 --- a/src/video_display/multiplier.cpp +++ b/src/video_display/multiplier.cpp @@ -44,7 +44,7 @@ #include "lib_common.h" #include "video.h" #include "video_display.h" -#include "utils/misc.h" +#include "utils/string_view_utils.hpp" #include #include diff --git a/src/video_display/rpi4_out.cpp b/src/video_display/rpi4_out.cpp index 9ad8526b4..c21e46434 100644 --- a/src/video_display/rpi4_out.cpp +++ b/src/video_display/rpi4_out.cpp @@ -45,7 +45,7 @@ #include "video_codec.h" #include "video_display.h" #include "hwaccel_rpi4.h" -#include "utils/misc.h" +#include "utils/string_view_utils.hpp" #include "utils/color_out.h" #include diff --git a/src/video_display/unix_sock.cpp b/src/video_display/unix_sock.cpp index 23bf5ff9d..e0ff6a3e5 100644 --- a/src/video_display/unix_sock.cpp +++ b/src/video_display/unix_sock.cpp @@ -61,7 +61,7 @@ #include "utils/misc.h" #include "utils/macros.h" #include "utils/color_out.h" -#include "utils/sv_parse_num.hpp" +#include "utils/string_view_utils.hpp" #include "tools/ipc_frame.h" #include "tools/ipc_frame_ug.h" #include "tools/ipc_frame_unix.h"