-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcore_str_api.h
117 lines (98 loc) · 9.88 KB
/
core_str_api.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#ifndef SW_CORE_STR_API_H_
#define SW_CORE_STR_API_H_
#include "core_preface.h"
#include "core_mem_api.h"
#include "core_char_api.h"
#include "core_utf8_api.h"
typedef SwOrZero(SwUsz) SwStrMatchLenOrZero;
SW_PUBL_API_IMPL inline SwUsz swStrByteLen8z(SwStrUtf8z str) { return __builtin_strlen((const char*)str); }
SW_PUBL_API_IMPL inline SwUsz swStrByteLenOrCap8z(SwUsz cap, const SwU8* str) { SwUsz n = 0; while (n < cap && str[n] != 0) { ++n; } return n; }
SW_PUBL_API_IMPL inline SwUsz swStrCodeptLen8z(SwStrUtf8z str) { SwUsz len = 0; while (*str != 0) { SW_DASSERT(swByteIsCodeptUtf8(*str) & !swByteIsContinUtf8(*str)); ++len; str += swByteGetCodeptByteLenUtf8(*str); } return len; }
SW_PUBL_API_IMPL inline SwIsz swStrCompare8z(SwStrUtf8z str1, SwStrUtf8z str2) { return __builtin_strcmp((const char*)str1, (const char*)str2); }
SW_PUBL_API_IMPL inline SwBool swStrEqual8z(SwStrUtf8z str1, SwStrUtf8z str2) { return swStrCompare8z(str1, str2) == 0; }
#define swStrIsAny8z(str,...) SW_TOK_CAT2(swStrIsAny8z_VA,SW_VA_COUNT(__VA_ARGS__))
SW_PUBL_API_IMPL inline SwBool swStrIsAny8z_VA1(SwStrUtf8z str, SwStrUtf8z a1) { return swStrEqual8z(str,a1); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8z_VA2(SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2) { return swStrEqual8z(str,a1)|swStrEqual8z(str,a2); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8z_VA3(SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3) { return swStrEqual8z(str,a1)|swStrEqual8z(str,a2)|swStrEqual8z(str,a3); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8z_VA4(SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3, SwStrUtf8z a4) { return swStrEqual8z(str,a1)|swStrEqual8z(str,a2)|swStrEqual8z(str,a3)|swStrEqual8z(str,a4); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8z_VA5(SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3, SwStrUtf8z a4, SwStrUtf8z a5) { return swStrEqual8z(str,a1)|swStrEqual8z(str,a2)|swStrEqual8z(str,a3)|swStrEqual8z(str,a4)|swStrEqual8z(str,a5); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8z_VA6(SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3, SwStrUtf8z a4, SwStrUtf8z a5, SwStrUtf8z a6) { return swStrEqual8z(str,a1)|swStrEqual8z(str,a2)|swStrEqual8z(str,a3)|swStrEqual8z(str,a4)|swStrEqual8z(str,a5)|swStrEqual8z(str,a6); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8z_VA7(SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3, SwStrUtf8z a4, SwStrUtf8z a5, SwStrUtf8z a6, SwStrUtf8z a7) { return swStrEqual8z(str,a1)|swStrEqual8z(str,a2)|swStrEqual8z(str,a3)|swStrEqual8z(str,a4)|swStrEqual8z(str,a5)|swStrEqual8z(str,a6)|swStrEqual8z(str,a7); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8z_VA8(SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3, SwStrUtf8z a4, SwStrUtf8z a5, SwStrUtf8z a6, SwStrUtf8z a7, SwStrUtf8z a8) { return swStrEqual8z(str,a1)|swStrEqual8z(str,a2)|swStrEqual8z(str,a3)|swStrEqual8z(str,a4)|swStrEqual8z(str,a5)|swStrEqual8z(str,a6)|swStrEqual8z(str,a7)|swStrEqual8z(str,a8); }
SW_PUBL_API_IMPL inline SwIsz swStrCompare8(SwUsz nBytesToCompMax, SwStrUtf8 str1, SwStrUtf8 str2) {
for (SwUsz i = 0; i < nBytesToCompMax; ++i) {
SwIsz diff = str1[i]-str2[i];
if (diff | !str1[i] | !str2[i]) {
return diff;
}
}
return 0;
}
SW_PUBL_API_IMPL inline SwBool swStrEqual8(SwUsz nBytesToCompMax, SwStrUtf8 str1, SwStrUtf8 str2) { return swStrCompare8(nBytesToCompMax, str1, str2) == 0; }
#define swStrIsAny8(nBytesToCompMax,str,...) SW_TOK_CAT2(swStrIsAny8_VA,SW_VA_COUNT(__VA_ARGS__))
SW_PUBL_API_IMPL inline SwBool swStrIsAny8_VA1(SwUsz nBytesToCompMax, SwStrUtf8z str, SwStrUtf8z a1) { return swStrEqual8(nBytesToCompMax,str,a1); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8_VA2(SwUsz nBytesToCompMax, SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2) { return swStrEqual8(nBytesToCompMax,str,a1)|swStrEqual8(nBytesToCompMax,str,a2); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8_VA3(SwUsz nBytesToCompMax, SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3) { return swStrEqual8(nBytesToCompMax,str,a1)|swStrEqual8(nBytesToCompMax,str,a2)|swStrEqual8(nBytesToCompMax,str,a3); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8_VA4(SwUsz nBytesToCompMax, SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3, SwStrUtf8z a4) { return swStrEqual8(nBytesToCompMax,str,a1)|swStrEqual8(nBytesToCompMax,str,a2)|swStrEqual8(nBytesToCompMax,str,a3)|swStrEqual8(nBytesToCompMax,str,a4); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8_VA5(SwUsz nBytesToCompMax, SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3, SwStrUtf8z a4, SwStrUtf8z a5) { return swStrEqual8(nBytesToCompMax,str,a1)|swStrEqual8(nBytesToCompMax,str,a2)|swStrEqual8(nBytesToCompMax,str,a3)|swStrEqual8(nBytesToCompMax,str,a4)|swStrEqual8(nBytesToCompMax,str,a5); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8_VA6(SwUsz nBytesToCompMax, SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3, SwStrUtf8z a4, SwStrUtf8z a5, SwStrUtf8z a6) { return swStrEqual8(nBytesToCompMax,str,a1)|swStrEqual8(nBytesToCompMax,str,a2)|swStrEqual8(nBytesToCompMax,str,a3)|swStrEqual8(nBytesToCompMax,str,a4)|swStrEqual8(nBytesToCompMax,str,a5)|swStrEqual8(nBytesToCompMax,str,a6); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8_VA7(SwUsz nBytesToCompMax, SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3, SwStrUtf8z a4, SwStrUtf8z a5, SwStrUtf8z a6, SwStrUtf8z a7) { return swStrEqual8(nBytesToCompMax,str,a1)|swStrEqual8(nBytesToCompMax,str,a2)|swStrEqual8(nBytesToCompMax,str,a3)|swStrEqual8(nBytesToCompMax,str,a4)|swStrEqual8(nBytesToCompMax,str,a5)|swStrEqual8(nBytesToCompMax,str,a6)|swStrEqual8(nBytesToCompMax,str,a7); }
SW_PUBL_API_IMPL inline SwBool swStrIsAny8_VA8(SwUsz nBytesToCompMax, SwStrUtf8z str, SwStrUtf8z a1, SwStrUtf8z a2, SwStrUtf8z a3, SwStrUtf8z a4, SwStrUtf8z a5, SwStrUtf8z a6, SwStrUtf8z a7, SwStrUtf8z a8) { return swStrEqual8(nBytesToCompMax,str,a1)|swStrEqual8(nBytesToCompMax,str,a2)|swStrEqual8(nBytesToCompMax,str,a3)|swStrEqual8(nBytesToCompMax,str,a4)|swStrEqual8(nBytesToCompMax,str,a5)|swStrEqual8(nBytesToCompMax,str,a6)|swStrEqual8(nBytesToCompMax,str,a7)|swStrEqual8(nBytesToCompMax,str,a8); }
SW_PUBL_API_IMPL inline SwBool swStrIsPrintA(SwUsz n, SwStrA str) { SW_DASSERT(n != 0); while (n != 0) { if (!swCharIsPrintA(str[--n])) { return swFALSE; } } return swTRUE; }
SW_PUBL_API_IMPL inline SwBool swStrIsPrintAz(SwStrAz str) { return swStrIsPrintA(swStrByteLen8z(str), str); }
SW_PUBL_API_IMPL inline SwUsz swStrCountByte8(SwUsz nBytesToScanMax, SwStrUtf8 str, SwU8 byteFind) { SW_DASSERT(byteFind != 0); SwUsz count = 0; for (SwUsz i = 0; i < nBytesToScanMax; ++i) { count += (str[i] == byteFind); if (str[i] == 0) break; } return count; }
SW_PUBL_API_IMPL inline SwUsz swStrCountByte8z(SwStrUtf8z str, SwU8 byteFind) { SW_DASSERT(byteFind != 0); SwUsz count = 0; do { count += (*str == byteFind); } while (*str++); return count; }
SW_PUBL_API_IMPL inline SwOrZero(const SwByteUtf8*) swStrFindByte8z(SwStrUtf8z str, SwU8 byteFind) { do { if (*str == byteFind) { return str; } } while (*str++); return (const SwU8*)swNULL; }
SW_PUBL_API_IMPL inline SwOrZero(const SwByteUtf8*) swStrFindByte8 (SwUsz nBytesToScanMax, SwStrUtf8 str, SwU8 byteFind) { for (SwUsz i = 0; i < nBytesToScanMax; ++i) { if (str[i] == byteFind) { return &str[i]; } if (str[i] == 0) { return (const SwU8*)swNULL; } } return (const SwU8*)swNULL; }
SW_PUBL_API_IMPL inline SwOrZero(const SwByteUtf8*) swStrFindStr8z (SwStrUtf8z str, SwStrUtf8z strFind) { return (const SwU8*)__builtin_strstr((const char*)str, (const char*)strFind); }
SW_PUBL_API_IMPL inline SwOrZero(const SwByteUtf8*) swStrFindStr8 (SwUsz nBytesToScanMax, SwStrUtf8 str, SwUsz nBytesInStrFind, SwStrUtf8 strFind) {
const SwByteUtf8* earlyZeroTerm = swStrFindByte8(nBytesInStrFind, strFind, 0);
nBytesInStrFind = earlyZeroTerm ? (earlyZeroTerm - strFind) : nBytesInStrFind;
if((nBytesInStrFind == 0) | (nBytesToScanMax < nBytesInStrFind)) { return (SwU8*)swNULL; }
if (nBytesInStrFind == 1) { return swStrFindByte8(nBytesToScanMax, str, *strFind); }
SwIsz j = 0;
for (SwIsz i = 0; (i + nBytesInStrFind) <= nBytesToScanMax; ++i) {
for (j = 0; j < nBytesInStrFind; ++j) {
if (str[i+j] == 0) return (const SwU8*)swNULL;
if (str[i+j] != strFind[j]) break;
}
if (j == nBytesInStrFind) return &str[i];
}
return (const SwU8*)swNULL;
}
SW_PUBL_API_IMPL inline SwStrMatchLenOrZero swStrMatchTilNonPrintA(SwStrA str1, SwStrA str2) {
SW_DASSERT(str1 && str2 && swCharIsApproxPrint(*str1) && swCharIsApproxPrint(*str2));
SwUsz i = 0;
SwBool isPri1;
SwBool isPri2;
do {
SW_DASSERT(str1 && str2 && swCharIsApproxPrint(*str1) && swCharIsApproxPrint(*str2));
if (str1[i] ^ str2[i]) { return 0; } // return false on mismatch
++i;
isPri1 = swCharIsApproxPrint(str1[i]);
isPri2 = swCharIsApproxPrint(str2[i]);
} while (isPri1 & isPri2); // breaks as soon as even one is a non printable (which includes e.g. spaces and '\0')
// either:
// - we have a mismatch <== str1[i-1] or str2[i-1] is outside the printable ascii range since we broke out of the loop
// - we have a match <== both str1[i-1] and str2[i-1] must be outside the printable ascii range (i.e. they "terminate" at the same char), and til `i` i.e. chars [0..i) we had a match)
return (!isPri1 & !isPri2) * i;
}
SW_PUBL_API_IMPL inline SwBool swStrIsMatchTilNonPrintA(SwStrA str1, SwStrA str2) {
return swStrMatchTilNonPrintA(str1, str2) > 0;
}
SW_PRIV_API_IMPL inline SwStr128bA swStrFmtBinaryA(SwU64 value, SwCharA sepChar, SwBitset64 sepPattern) {
SW_DASSERT(sepPattern != swU64_Max); // would overflow 128b cap (64 bin digits + 64 separators + 0 terminator = 129b)
SwStr128bA out;
SwUsz r = 63; // bit index (read)
SwUsz w = 0; // char index (write)
do {
out.str[w] = sepChar;
w += (sepPattern >> r) & 1;
out.str[w++] = '0' + ((value >> r) & 1);
--r;
} while (r < 64);
SW_DASSERT(w < 128);
out.str[w] = '\0';
return out;
}
#endif // SW_CORE_STR_API_H_