xref: /aosp_15_r20/external/dynamic_depth/internal/strings/util.h (revision a62be0856e8e1158f43b03e41bbad10f4d005fde)
1*a62be085SSadaf Ebrahimi // Useful string functions and so forth.  This is a grab-bag file.
2*a62be085SSadaf Ebrahimi //
3*a62be085SSadaf Ebrahimi // You might also want to look at memutil.h, which holds mem*()
4*a62be085SSadaf Ebrahimi // equivalents of a lot of the str*() functions in string.h,
5*a62be085SSadaf Ebrahimi // eg memstr, mempbrk, etc.
6*a62be085SSadaf Ebrahimi //
7*a62be085SSadaf Ebrahimi // These functions work fine for UTF-8 strings as long as you can
8*a62be085SSadaf Ebrahimi // consider them to be just byte strings.  For example, due to the
9*a62be085SSadaf Ebrahimi // design of UTF-8 you do not need to worry about accidental matches,
10*a62be085SSadaf Ebrahimi // as long as all your inputs are valid UTF-8 (use \uHHHH, not \xHH or \oOOO).
11*a62be085SSadaf Ebrahimi //
12*a62be085SSadaf Ebrahimi // Caveats:
13*a62be085SSadaf Ebrahimi // * all the lengths in these routines refer to byte counts,
14*a62be085SSadaf Ebrahimi //   not character counts.
15*a62be085SSadaf Ebrahimi // * case-insensitivity in these routines assumes that all the letters
16*a62be085SSadaf Ebrahimi //   in question are in the range A-Z or a-z.
17*a62be085SSadaf Ebrahimi //
18*a62be085SSadaf Ebrahimi // If you need Unicode specific processing (for example being aware of
19*a62be085SSadaf Ebrahimi // Unicode character boundaries, or knowledge of Unicode casing rules,
20*a62be085SSadaf Ebrahimi // or various forms of equivalence and normalization), take a look at
21*a62be085SSadaf Ebrahimi // files in i18n/utf8.
22*a62be085SSadaf Ebrahimi 
23*a62be085SSadaf Ebrahimi #ifndef DYNAMIC_DEPTH_INTERNAL_STRINGS_UTIL_H_  // NOLINT
24*a62be085SSadaf Ebrahimi #define DYNAMIC_DEPTH_INTERNAL_STRINGS_UTIL_H_  // NOLINT
25*a62be085SSadaf Ebrahimi 
26*a62be085SSadaf Ebrahimi #include <string>
27*a62be085SSadaf Ebrahimi 
28*a62be085SSadaf Ebrahimi #include "base/port.h"
29*a62be085SSadaf Ebrahimi #include "fastmem.h"
30*a62be085SSadaf Ebrahimi 
31*a62be085SSadaf Ebrahimi namespace dynamic_depth {
32*a62be085SSadaf Ebrahimi 
33*a62be085SSadaf Ebrahimi // Returns whether str begins with prefix.
HasPrefixString(const string & str,const string & prefix)34*a62be085SSadaf Ebrahimi inline bool HasPrefixString(const string& str, const string& prefix) {
35*a62be085SSadaf Ebrahimi   return str.length() >= prefix.length() &&
36*a62be085SSadaf Ebrahimi          ::dynamic_depth::strings::memeq(&str[0], &prefix[0], prefix.length());
37*a62be085SSadaf Ebrahimi }
38*a62be085SSadaf Ebrahimi 
39*a62be085SSadaf Ebrahimi // Returns whether str ends with suffix.
HasSuffixString(const string & str,const string & suffix)40*a62be085SSadaf Ebrahimi inline bool HasSuffixString(const string& str, const string& suffix) {
41*a62be085SSadaf Ebrahimi   return str.length() >= suffix.length() &&
42*a62be085SSadaf Ebrahimi          ::dynamic_depth::strings::memeq(
43*a62be085SSadaf Ebrahimi              &str[0] + (str.length() - suffix.length()), &suffix[0],
44*a62be085SSadaf Ebrahimi              suffix.length());
45*a62be085SSadaf Ebrahimi }
46*a62be085SSadaf Ebrahimi 
47*a62be085SSadaf Ebrahimi }  // namespace dynamic_depth
48*a62be085SSadaf Ebrahimi 
49*a62be085SSadaf Ebrahimi #endif  // DYNAMIC_DEPTH_INTERNAL_STRINGS_UTIL_H_  // NOLINT
50