1+ #ifndef SYSCALL_CRT_HPP
2+ #define SYSCALL_CRT_HPP
3+
4+ #include < cstdint>
5+ #include < cwchar>
6+
7+ namespace syscall ::crt
8+ {
9+ template <typename T, size_t N>
10+ [[nodiscard]] constexpr size_t getCountOf (T(&)[N]) noexcept
11+ {
12+ return N;
13+ }
14+
15+ namespace string
16+ {
17+ constexpr char toLower (char c) noexcept
18+ {
19+ return (c >= ' A' && c <= ' Z' ) ? (c + (' a' - ' A' )) : c;
20+ }
21+ constexpr wchar_t toLower (wchar_t c) noexcept
22+ {
23+ return (c >= L' A' && c <= L' Z' ) ? (c + (L' a' - L' A' )) : c;
24+ }
25+
26+ constexpr size_t getLength (const char * szStr) noexcept
27+ {
28+ const char * s = szStr;
29+ while (*s)
30+ ++s;
31+
32+ return s - szStr;
33+ }
34+
35+ constexpr size_t getLength (const wchar_t * wzStr) noexcept
36+ {
37+ const wchar_t * s = wzStr;
38+ while (*s)
39+ ++s;
40+
41+ return s - wzStr;
42+ }
43+
44+ [[nodiscard]] constexpr int compare (const char * szFirst, const char * szSecond) noexcept
45+ {
46+ while (*szFirst && (*szFirst == *szSecond))
47+ {
48+ szFirst++;
49+ szSecond++;
50+ }
51+
52+ return *(const unsigned char *)szFirst - *(const unsigned char *)szSecond;
53+ }
54+
55+ [[nodiscard]] constexpr int compareIgnoreCase (const wchar_t * szFirst, const wchar_t * szSecond) noexcept
56+ {
57+ wchar_t c1, c2;
58+ do {
59+ c1 = toLower (*szFirst++);
60+ c2 = toLower (*szSecond++);
61+
62+ if (c1 == L' \0 ' )
63+ return c1 - c2;
64+ } while (c1 == c2);
65+
66+ return c1 - c2;
67+ }
68+
69+ [[nodiscard]] constexpr const char * findChar (const char * str, int character) noexcept
70+ {
71+ while (*str != ' \0 ' )
72+ {
73+ if (*str == static_cast <char >(character))
74+ return str;
75+
76+ str++;
77+ }
78+ return nullptr ;
79+ }
80+
81+ [[nodiscard]] inline char * findChar (char * str, int character) noexcept
82+ {
83+ return const_cast <char *>(findChar (static_cast <const char *>(str), character));
84+ }
85+
86+ inline void copy (char * szDest, size_t uDestLength, const char * src) noexcept
87+ {
88+ if (!szDest || !uDestLength)
89+ return ;
90+
91+ const size_t uSourceLength = getLength (src);
92+
93+ const size_t uCount = (uSourceLength < uDestLength) ? uSourceLength : (uDestLength - 1 );
94+ std::copy_n (src, uCount, szDest);
95+ szDest[uCount] = ' \0 ' ;
96+ }
97+
98+ inline void concat (wchar_t * pDest, size_t uSizeInElements, const wchar_t * pSource) noexcept
99+ {
100+ if (!pDest || !uSizeInElements)
101+ return ;
102+
103+ const size_t uDestLength = getLength (pDest);
104+ if (uDestLength >= uSizeInElements - 1 )
105+ return ;
106+
107+
108+ const size_t uSourceLength = getLength (pSource);
109+ const size_t uRemainingSpace = uSizeInElements - uDestLength - 1 ;
110+ const size_t uCount = (uSourceLength < uRemainingSpace) ? uSourceLength : uRemainingSpace;
111+
112+ std::copy_n (pSource, uCount * sizeof (wchar_t ), pDest + uDestLength);
113+ pDest[uDestLength + uCount] = L' \0 ' ;
114+ }
115+
116+ inline void mbToWcs (wchar_t * pDest, size_t uSizeInElements, const char * pSource) noexcept
117+ {
118+ if (!pDest || !uSizeInElements)
119+ return ;
120+
121+ const size_t uSourceLength = getLength (pSource);
122+ const size_t uCount = (uSourceLength < uSizeInElements) ? uSourceLength : (uSizeInElements - 1 );
123+ for (size_t i = 0 ; i < uCount; ++i)
124+ pDest[i] = static_cast <wchar_t >(static_cast <unsigned char >(pSource[i]));
125+
126+ pDest[uCount] = L' \0 ' ;
127+ }
128+ }
129+ }
130+
131+ #endif
0 commit comments