From 7818c3bda37e4dec09331cf5b0a6ac1c0f49a3fa Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Tue, 20 Sep 2016 22:28:48 -0700 Subject: [PATCH] USBCamera: Normalize property names. --- src/USBCameraImpl.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/USBCameraImpl.cpp b/src/USBCameraImpl.cpp index 9956874d2d..256c5746d3 100644 --- a/src/USBCameraImpl.cpp +++ b/src/USBCameraImpl.cpp @@ -36,6 +36,22 @@ using namespace cs; #ifdef __linux__ +// Removes non-alphanumeric characters and replaces spaces with underscores. +// e.g. "Zoom, Absolute" -> "zoom_absolute", "Pan (Absolute)" -> "pan_absolute" +static llvm::StringRef NormalizeName(llvm::StringRef name, + llvm::SmallVectorImpl& buf) { + bool newWord = false; + for (auto ch : name) { + if (std::isalnum(ch)) { + if (newWord) buf.push_back('_'); + newWord = false; + buf.push_back(std::tolower(ch)); + } else if (!buf.empty()) + newWord = true; + } + return llvm::StringRef(buf.data(), buf.size()); +} + static inline int ControlIdToProperty(__u32 control_id) { return (control_id & 0xffff) + 1; } @@ -72,7 +88,8 @@ USBCameraImpl::PropertyData::PropertyData( // name std::size_t len = 0; while (len < sizeof(ctrl.name) && ctrl.name[len] != '\0') ++len; - name.assign(ctrl.name, len); + llvm::SmallString<64> name_buf; + name = NormalizeName(llvm::StringRef(ctrl.name, len), name_buf); } #endif @@ -106,7 +123,9 @@ USBCameraImpl::PropertyData::PropertyData(const struct v4l2_queryctrl& ctrl) // name std::size_t len = 0; while (len < sizeof(ctrl.name) && ctrl.name[len] != '\0') ++len; - name.assign(reinterpret_cast(ctrl.name), len); + llvm::SmallString<64> name_buf; + name = NormalizeName( + llvm::StringRef(reinterpret_cast(ctrl.name), len), name_buf); } static inline int CheckedIoctl(int fd, unsigned long req, void* data,