| // Copyright 2015 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BIDL_UTILS_H_ |
| #define BIDL_UTILS_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| using std::vector; |
| using std::string; |
| |
| // Some handy utility functions. |
| |
| inline bool HasSuffixString(const string& str, const string& suffix) { |
| return str.size() >= suffix.size() && |
| str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; |
| } |
| |
| inline string StripSuffixString(const string& str, const string& suffix) { |
| if (HasSuffixString(str, suffix)) { |
| return str.substr(0, str.size() - suffix.size()); |
| } else { |
| return str; |
| } |
| } |
| |
| string StripProto(const string& filename) { |
| if (HasSuffixString(filename, ".protodevel")) { |
| return StripSuffixString(filename, ".protodevel"); |
| } else { |
| return StripSuffixString(filename, ".proto"); |
| } |
| } |
| |
| // ---------------------------------------------------------------------- |
| // SplitStringUsing() |
| // Split a string using a character delimiter. Append the components |
| // to 'result'. |
| // |
| // Note: For multi-character delimiters, this routine will split on *ANY* of |
| // the characters in the string, not the entire string as a single delimiter. |
| // ---------------------------------------------------------------------- |
| template <typename ITR> |
| static inline void SplitStringToIteratorUsing(const string& full, |
| const char* delim, |
| ITR* result) { |
| // Optimize the common case where delim is a single character. |
| if (delim[0] != '\0' && delim[1] == '\0') { |
| char c = delim[0]; |
| const char* p = full.data(); |
| const char* end = p + full.size(); |
| while (p != end) { |
| if (*p == c) { |
| ++p; |
| } else { |
| const char* start = p; |
| while (++p != end && *p != c) { |
| } |
| *(*result)++ = string(start, p - start); |
| } |
| } |
| return; |
| } |
| |
| string::size_type begin_index, end_index; |
| begin_index = full.find_first_not_of(delim); |
| while (begin_index != string::npos) { |
| end_index = full.find_first_of(delim, begin_index); |
| if (end_index == string::npos) { |
| *result++ = full.substr(begin_index); |
| return; |
| } |
| *result++ = full.substr(begin_index, (end_index - begin_index)); |
| begin_index = full.find_first_not_of(delim, end_index); |
| } |
| } |
| |
| void SplitStringUsing(const string& full, |
| const char* delim, |
| vector<string>* result) { |
| std::back_insert_iterator<vector<string> > it(*result); |
| SplitStringToIteratorUsing(full, delim, &it); |
| } |
| |
| #endif // BIDL_UTILS_H_ |