annotate foosdk/sdk/pfc/string-compare.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "string-part.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "primitives.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 int wstricmp_ascii(const wchar_t* s1, const wchar_t* s2) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 int stricmp_ascii(const char* s1, const char* s2) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 int stricmp_ascii_ex(const char* s1, t_size len1, const char* s2, t_size len2) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 // Platform-independant lowlevel natural sort implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 int naturalSortCompare(const char* s1, const char* s2) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 int naturalSortCompareI(const char* s1, const char* s2) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 // System-specialized natural sort compare, better ordering of Unicode text, specialized for Apple and MS platforms
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 // Falls back to naturalSortCompare/naturalSortCompareI where not available
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 int sysNaturalSortCompare(const char* s1, const char* s2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 int sysNaturalSortCompareI(const char* s1, const char* s2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 int strcmp_ex(const char* p1, t_size n1, const char* p2, t_size n2) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 int strcmp_nc(const char* p1, size_t n1, const char* p2, size_t n2) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 bool stringEqualsI_utf8(const char* p1, const char* p2) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 bool stringEqualsI_ascii(const char* p1, const char* p2) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 bool stringEqualsI_ascii_ex(const char* p1, size_t l1, const char* p2, size_t l2) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 int stringCompareCaseInsensitive(const char* s1, const char* s2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 int stringCompareCaseInsensitiveEx(string_part_ref s1, string_part_ref s2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 template<typename T> inline const char* stringToPtr(T const& val) { return val.c_str(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 inline const char* stringToPtr(const char* val) { return val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 class _stringComparatorCommon {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 template<typename T> static const char* myStringToPtr(const T& val) { return stringToPtr(val); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 static const char* myStringToPtr(string_part_ref);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 class stringComparatorCaseSensitive : private _stringComparatorCommon {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 template<typename T1, typename T2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 static int compare(T1 const& v1, T2 const& v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 if (is_same_type<T1, string_part_ref>::value || is_same_type<T2, string_part_ref>::value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 return compare_ex(stringToRef(v1), stringToRef(v2));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 return strcmp(myStringToPtr(v1), myStringToPtr(v2));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 static int compare_ex(string_part_ref v1, string_part_ref v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 return strcmp_ex(v1.m_ptr, v1.m_len, v2.m_ptr, v2.m_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 static int compare_ex(const char* v1, t_size l1, const char* v2, t_size l2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 return strcmp_ex(v1, l1, v2, l2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 class stringComparatorCaseInsensitive : private _stringComparatorCommon {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 template<typename T1, typename T2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 static int compare(T1 const& v1, T2 const& v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 if constexpr (is_same_type<T1, string_part_ref>::value || is_same_type<T2, string_part_ref>::value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 return stringCompareCaseInsensitiveEx(stringToRef(v1), stringToRef(v2));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 return stringCompareCaseInsensitive(myStringToPtr(v1), myStringToPtr(v2));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 class stringComparatorCaseInsensitiveASCII : private _stringComparatorCommon {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 template<typename T1, typename T2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 static int compare(T1 const& v1, T2 const& v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 if constexpr (is_same_type<T1, string_part_ref>::value || is_same_type<T2, string_part_ref>::value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 return compare_ex(stringToRef(v1), stringToRef(v2));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 return stricmp_ascii(myStringToPtr(v1), myStringToPtr(v2));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 static int compare_ex(string_part_ref v1, string_part_ref v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 return stricmp_ascii_ex(v1.m_ptr, v1.m_len, v2.m_ptr, v2.m_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 static int compare_ex(const char* v1, t_size l1, const char* v2, t_size l2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 return stricmp_ascii_ex(v1, l1, v2, l2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 class comparator_strcmp {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 inline static int compare(const char* p_item1, const char* p_item2) { return strcmp(p_item1, p_item2); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 inline static int compare(const wchar_t* item1, const wchar_t* item2) { return wcscmp(item1, item2); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 static int compare(const char* p_item1, string_part_ref p_item2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 return strcmp_ex(p_item1, SIZE_MAX, p_item2.m_ptr, p_item2.m_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 static int compare(string_part_ref p_item1, string_part_ref p_item2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 return strcmp_ex(p_item1.m_ptr, p_item1.m_len, p_item2.m_ptr, p_item2.m_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 static int compare(string_part_ref p_item1, const char* p_item2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 return strcmp_ex(p_item1.m_ptr, p_item1.m_len, p_item2, SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 class comparator_stricmp_ascii {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 inline static int compare(const char* p_item1, const char* p_item2) { return stricmp_ascii(p_item1, p_item2); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 class comparator_naturalSort {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 inline static int compare(const char* i1, const char* i2) throw() { return naturalSortCompare(i1, i2); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 template<typename t_char> int _strcmp_partial_ex(const t_char* p_string, t_size p_string_length, const t_char* p_substring, t_size p_substring_length) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 for (t_size walk = 0; walk < p_substring_length; walk++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 t_char stringchar = (walk >= p_string_length ? 0 : p_string[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 t_char substringchar = p_substring[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 int result = compare_t(stringchar, substringchar);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 if (result != 0) return result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 template<typename t_char> int strcmp_partial_ex_t(const t_char* p_string, t_size p_string_length, const t_char* p_substring, t_size p_substring_length) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 p_string_length = strlen_max_t(p_string, p_string_length); p_substring_length = strlen_max_t(p_substring, p_substring_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 return _strcmp_partial_ex(p_string, p_string_length, p_substring, p_substring_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 template<typename t_char>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 int strcmp_partial_t(const t_char* p_string, const t_char* p_substring) throw() { return strcmp_partial_ex_t(p_string, SIZE_MAX, p_substring, SIZE_MAX); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 inline int strcmp_partial_ex(const char* str, t_size strLen, const char* substr, t_size substrLen) throw() { return strcmp_partial_ex_t(str, strLen, substr, substrLen); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 inline int strcmp_partial(const char* str, const char* substr) throw() { return strcmp_partial_t(str, substr); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 int stricmp_ascii_partial(const char* str, const char* substr) throw();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 }