21#include "scid/core/game_result.h"
22#include "scid/database/common.h"
49 explicit StrRange(
const char* range) {
51 min_ = std::strtol(range, &next, 10);
53 max_ = std::strtol(next, &end, 10);
54 if (next == end) max_ = min_;
55 if (min_ > max_) std::swap(min_, max_);
60 if (val < min_ || val > max_)
return false;
70 virtual bool report(
size_t done,
size_t total,
const char* msg) = 0;
77 bool report(
size_t done,
size_t total)
const {
78 return operator()(done, total);
80 bool operator()(
size_t done,
size_t total,
const char* msg = NULL)
const {
81 if (f_)
return f_->report(done, total, msg);
93enum filterOpT { FILTEROP_AND, FILTEROP_OR, FILTEROP_RESET };
95inline filterOpT strGetFilterOp (
const char * str)
99 case 'A':
case 'a':
case '0':
return FILTEROP_AND;
101 case 'O':
case 'o':
case '1':
return FILTEROP_OR;
103 case 'R':
case 'r':
case '2':
return FILTEROP_RESET;
106 return FILTEROP_RESET;
115inline uint32_t strStartHash(
const char* str) {
117 const unsigned char* s =
reinterpret_cast<const unsigned char*
>(str);
119 uint32_t tmp =
static_cast<unsigned char>(tolower(*s));
120 uint32_t result = tmp << 24;
121 if (*s ==
'\0')
return result;
122 tmp =
static_cast<unsigned char>(tolower(*++s));
124 if (*s ==
'\0')
return result;
125 tmp =
static_cast<unsigned char>(tolower(*++s));
127 if (*s ==
'\0')
return result;
128 result +=
static_cast<unsigned char>(tolower(*++s));
132char * strDuplicate (
const char * str);
134char * strAppend (
char * target,
const char * extra);
135scid::core::uint strPad (
char * target,
const char * orig,
int length,
char pad);
136const char * strFirstChar (
const char * target,
char matchChar);
137const char * strLastChar (
const char * target,
char matchChar);
138void strStrip (
char * str,
char ch);
140const char * strTrimLeft (
const char * target,
const char * trimChars);
141inline const char * strTrimLeft (
const char * target) {
142 return strTrimLeft (target,
" \t\r\n");
144scid::core::uint strTrimSuffix (
char * target,
char suffixChar);
145void strTrimDate (
char * str);
146void strTrimMarkCodes (
char * str);
147void strTrimMarkup (
char * str);
148const char * strFirstWord (
const char * str);
149const char * strNextWord (
const char * str);
154strPlural (scid::core::uint x) {
155 return (x == 1 ?
"" :
"s");
158bool strIsUnknownName (
const char * str);
162bool strIsSurnameOnly (
const char * name);
164bool strGetBoolean (
const char * str);
171strGetInteger(
const char * str)
173 return std::strtol(str, NULL, 10);
181inline uint32_t strGetUnsigned(
const char* str) {
183 return static_cast<uint32_t
>(std::strtoul(str, NULL, 10));
186inline int strCaseCompare(
const char* str1,
const char* str2) {
187 ASSERT(str1 != NULL && str2 != NULL);
188 const unsigned char* s1 =
reinterpret_cast<const unsigned char*
>(str1);
189 const unsigned char* s2 =
reinterpret_cast<const unsigned char*
>(str2);
201inline int strCompareRound(
const char* str1,
const char* str2) {
202 ASSERT(str1 != NULL && str2 != NULL);
203 uint32_t a = strGetUnsigned(str1);
204 uint32_t b = strGetUnsigned(str2);
206 return strCaseCompare(str1, str2);
207 return (a < b) ? -1 : 1;
210inline bool strEqual(
const char* str1,
const char* str2) {
211 ASSERT(str1 != NULL && str2 != NULL);
212 return (std::strcmp(str1, str2) == 0);
215void strGetIntegers (
const char * str,
int * results, scid::core::uint nResults);
216void strGetUnsigneds (
const char * str, scid::core::uint * results, scid::core::uint nResults);
217scid::core::resultT strGetResult (
const char * str);
219typedef scid::core::uint flagT;
220const flagT FLAG_EMPTY = 0;
221const flagT FLAG_YES = 1;
222const flagT FLAG_NO = 2;
223const flagT FLAG_BOTH = 3;
224inline bool flag_Yes (flagT t) {
return (t & FLAG_YES); }
225inline bool flag_No (flagT t) {
return (t & FLAG_NO); }
226flagT strGetFlag (
const char * str);
228scid::core::squareT strGetSquare (
const char * str);
230inline scid::core::uint
231strTrimFileSuffix (
char * target) {
return strTrimSuffix (target,
'.'); }
234strFileSuffix (
const char * target) {
return strLastChar (target,
'.'); }
238int strUniqueExactMatch (
const char * keyStr,
const char ** strTable,
241inline int strUniqueMatch (
const char * keyStr,
const char ** strTable) {
242 return strUniqueExactMatch (keyStr, strTable,
false);
244inline int strExactMatch (
const char * keyStr,
const char ** strTable) {
245 return strUniqueExactMatch (keyStr, strTable,
true);
249strContainsChar (
const char * str,
char ch)
252 if (*str == ch) {
return true; }
266inline int strCompare(
const char* s1,
const char* s2)
268 ASSERT (s1 != NULL && s2 != NULL);
271 return ((
int) *s1) - ((int) *s2);
284strCopy (
char * target,
const char * original)
286 ASSERT (target != NULL && original != NULL);
287 while (*original != 0) {
299inline scid::core::uint
300strPrefix (
const char * s1,
const char * s2)
302 ASSERT (s1 != NULL && s2 != NULL);
303 scid::core::uint count = 0;
317strIsPrefix (
const char * prefix,
const char * longStr)
320 if (*longStr == 0) {
return false; }
321 if (*prefix != *longStr) {
return false; }
333strIsCasePrefix (
const char * prefix,
const char * longStr)
335 typedef unsigned char U;
337 if (*longStr == 0) {
return false; }
338 if (tolower(U(*prefix)) != tolower(U(*longStr))) {
return false; }
352strIsAlphaPrefix (
const char * prefix,
const char * longStr)
354 typedef unsigned char U;
356 while (*prefix ==
' ') { prefix++; }
357 while (*longStr ==
' ') { longStr++; }
358 if (*longStr == 0) {
return false; }
359 if (tolower(U(*prefix)) != tolower(U(*longStr))) {
return false; }
371strContains (
const char * longStr,
const char * keyStr)
374 if (strIsPrefix (keyStr, longStr)) {
return true; }
387strAlphaContains (
const char * longStr,
const char * keyStr)
390 if (strIsAlphaPrefix (keyStr, longStr)) {
return true; }
396inline scid::core::uint
397strLength (
const char * str)
400 scid::core::uint len = 0;
401 while (*str != 0) { len++; str++; }
413inline void strTrimRight(
char* target,
const char* trimChars,
size_t nTrimCh) {
414 const char* endTrim = trimChars + nTrimCh;
415 size_t iCh = strlen(target);
416 for (; iCh > 0; --iCh) {
417 if (std::find(trimChars, endTrim, target[iCh - 1]) == endTrim)
422inline void strTrimRight(
char* target) {
423 return strTrimRight(target,
" \t\r\n", 4);
bool inRange(long val) const
Definition misc.h:59
class StrRange - parse a string interpreting its content as 1 or 2 integers separated by whitespace.
Definition common.h:30