1 #ifndef BZS_DB_PROTOCOL_TDAP_FIELD_COMP_H
2 #define BZS_DB_PROTOCOL_TDAP_FIELD_COMP_H
21 #include <bzs/db/protocol/tdap/tdapcapi.h>
22 #include <bzs/env/crosscompile.h>
26 inline int compareUint24(
const char* l,
const char* r)
28 unsigned int lv = *((
unsigned int*)l) & 0xFFFFFF;
29 unsigned int rv = *((
unsigned int*)r) & 0xFFFFFF;
37 inline int compareInt24(
const char* l,
const char* r)
39 int lv = ((*((
int*)l) & 0xFFFFFF) << 8) / 0x100;
40 int rv = ((*((
int*)r) & 0xFFFFFF) << 8) / 0x100;
49 template <
class T>
inline int compare(
const char* l,
const char* r)
51 if (*((T*)l) < *((T*)r))
53 else if (*((T*)l) > *((T*)r))
58 template <
class T>
inline int bitMask(
const char* l,
const char* r)
60 T v = *((T*)l) & *((T*)r);
61 return (
int)(*((T*)r) - v);
64 template <
class T>
inline int compare(T l, T r)
74 inline int compareVartype(
const char* l,
const char* r,
bool bin,
char logType)
78 int tmp = std::min<int>(llen, rlen);
79 if (logType & CMPLOGICAL_CASEINSENSITIVE)
80 tmp = _strnicmp(l +
sizeof(T), r +
sizeof(T), tmp);
82 tmp = memcmp(l +
sizeof(T), r +
sizeof(T), tmp);
84 tmp = strncmp(l +
sizeof(T), r +
sizeof(T), tmp);
86 if (logType & CMPLOGICAL_VAR_COMP_ALL)
87 return (tmp == 0) ? compare<int>(llen, rlen) : tmp;
88 return (tmp == 0 && (llen < rlen)) ? -1 : tmp;
92 inline int compareWvartype(
const char* l,
const char* r,
bool bin,
char logType)
94 int llen = (*(T*)l) /
sizeof(char16_t);
95 int rlen = (*(T*)r) /
sizeof(char16_t);
96 int tmp = std::min<int>(llen, rlen);
97 if (logType & CMPLOGICAL_CASEINSENSITIVE)
98 tmp = wcsnicmp16((char16_t*)(l +
sizeof(T)), (char16_t*)(r +
sizeof(T)),
102 wmemcmp16((char16_t*)(l +
sizeof(T)), (char16_t*)(r +
sizeof(T)), tmp);
104 tmp = wcsncmp16((char16_t*)(l +
sizeof(T)), (char16_t*)(r +
sizeof(T)),
106 if (logType & CMPLOGICAL_VAR_COMP_ALL)
107 return (tmp == 0) ? compare<int>(llen, rlen) : tmp;
108 return (tmp == 0 && (llen < rlen)) ? -1 : tmp;
111 inline int compareBlobType(
const char* l,
const char* r,
bool bin,
char logType,
116 memcpy(&llen, l, sizeByte);
117 memcpy(&rlen, r, sizeByte);
118 int tmp = std::min<int>(llen, rlen);
119 const char* lptr = *((
const char**)(l + sizeByte));
120 const char* rptr = r + sizeByte;
121 if (logType & CMPLOGICAL_CASEINSENSITIVE)
122 tmp = _strnicmp(lptr, rptr, tmp);
124 tmp = memcmp(lptr, rptr, tmp);
126 tmp = strncmp(lptr, rptr, tmp);
128 if (logType & CMPLOGICAL_VAR_COMP_ALL)
129 return (tmp == 0) ? compare<int>(llen, rlen) : tmp;
130 return (tmp == 0 && (llen < rlen)) ? -1 : tmp;