43 if (*ecoStr >=
'A' && *ecoStr <=
'E') {
44 eco = (*ecoStr -
'A') * 13100;
45 }
else if (*ecoStr >=
'a' && *ecoStr <=
'e') {
46 eco = (*ecoStr -
'a') * 13100;
51 if (! *ecoStr) {
return eco + 1; }
53 if (*ecoStr < '0' || *ecoStr >
'9') {
return 0; }
54 eco += (*ecoStr -
'0') * 1310;
56 if (! *ecoStr) {
return eco + 1; }
58 if (*ecoStr < '0' || *ecoStr >
'9') {
return 0; }
59 eco += (*ecoStr -
'0') * 131;
63 if (*ecoStr >=
'a' && *ecoStr <=
'z') {
65 eco += (*ecoStr -
'a') * 5;
67 if (*ecoStr >=
'1' && *ecoStr <=
'4') {
81 if (ecoCode ==
ECO_None) { *s = 0;
return; }
86 ecoT basicCode = ecoCode / 131;
87 *s++ = basicCode / 100 +
'A';
88 *s++ = (basicCode % 100) / 10 +
'0';
89 *s++ = (basicCode % 10) +
'0';
93 ecoCode = ecoCode % 131;
96 *s++ = (ecoCode / 5) +
'a';
97 ecoCode = ecoCode % 5;
98 if (ecoCode > 0) { *s++ = (ecoCode +
'0'); }
134 ecoT res = (eco / 131) * 27;
135 return res +
static_cast<ecoT>(std::ceil((eco % 131) / 5.0));
149 if ((eco % 131) == 0) { eco += 126; }
152 if (((eco % 131) % 5) == 1) { eco += 4; }
164 const char * excludeChars)
166 while (*original != 0) {
168 for (
char * s = (
char *) excludeChars; *s; s++) {
169 if (*original == *s) {
191 ASSERT (target != NULL && extra != NULL);
192 while (*target != 0) { target++; }
193 while (*extra != 0) {
208 ASSERT (original != NULL);
209 char * newStr =
new char [
strLength(original) + 1];
210 if (newStr == NULL)
return NULL;
212 while (*original != 0) {
235 strPad (
char * target,
const char * original,
int width,
char padding)
237 ASSERT (target != NULL && original != NULL);
244 if (*original == 0) {
252 while (len--) { *target++ = padding; }
266 const char * s = target;
268 if (*s == matchChar) {
return s; }
283 const char * s = target;
284 const char * last = NULL;
286 if (*s == matchChar) { last = s; }
301 if (s != str) { *s = *str; }
316 const char * s = target;
335 char * lastSuffixPtr = NULL;
338 if (*s == suffixChar) {
345 if (lastSuffixPtr == NULL) {
return 0; }
358 if (str[7] ==
'.' && str[8] ==
'?' && str[9] ==
'?') {
360 if (str[4] ==
'.' && str[5] ==
'?' && str[6] ==
'?') {
376 char * startLocation = NULL;
384 if (ch == 0 || ch ==
'[') {
385 *out++ = *startLocation;
388 }
else if (ch ==
']') {
395 if (ch == 0) {
break; }
397 if (ch ==
'[' && in[1] ==
'%') {
424 if (ch ==
'>') { inTag =
false; }
426 if (ch ==
'<') { inTag =
true; }
else { *out++ = ch; }
441 while (*str != 0 && isspace(static_cast<unsigned char>(*str))) { str++; }
454 while (*str != 0 && !isspace(static_cast<unsigned char>(*str))) { str++; }
455 while (*str != 0 && isspace(static_cast<unsigned char>(*str))) { str++; }
467 if (str[0] == 0) {
return true; }
468 if (str[0] ==
'-' && str[1] == 0) {
return true; }
469 if (str[0] ==
'?' && str[1] == 0) {
return true; }
480 const char * s =
name;
482 unsigned char c = *s;
483 if (! isalpha(c)) {
return false; }
486 if (capcount > 1) {
return false; }
502 static const char * sTrue[] = {
503 "true",
"yes",
"on",
"1",
"ja",
"si",
"oui", NULL
505 static const char * sFalse[] = {
506 "false",
"no",
"off",
"0", NULL
508 if (str[0] == 0) {
return false; }
510 bool matchedTrue =
false;
511 bool matchedFalse =
false;
513 const char ** next = sTrue;
514 while (*next != NULL) {
521 while (*next != NULL) {
527 if (matchedTrue && !matchedFalse) {
return true; }
528 if (matchedFalse && !matchedTrue) {
return false; }
541 for (
uint i=0; i < nResults; i++) {
542 while (*str != 0 && isspace(static_cast<unsigned char>(*str))) { str++; }
544 while (*str != 0 && !isspace(static_cast<unsigned char>(*str))) { str++; }
555 for (
uint i=0; i < nResults; i++) {
556 while (*str != 0 && isspace(static_cast<unsigned char>(*str))) { str++; }
558 while (*str != 0 && !isspace(static_cast<unsigned char>(*str))) { str++; }
571 if (str[1] ==
'/' && str[2] ==
'2') {
616 char chFyle = str[0];
617 if (chFyle < 'a' || chFyle >
'h') {
return NULL_SQUARE; }
618 char chRank = str[1];
619 if (chRank < '1' || chRank >
'8') {
return NULL_SQUARE; }
642 int abbrevMatches = 0;
645 const char ** entryPtr = strTable;
648 if (keyStr == NULL || strTable == NULL) {
return -1; }
651 for (
int i=0; *entryPtr != NULL; entryPtr++, i++) {
653 for (s1 = keyStr, s2 = *entryPtr; *s1 == *s2; s1++, s2++) {
668 if (exact || abbrevMatches != 1) {
fyleT fyle_FromChar(char c)
void eco_ToString(ecoT ecoCode, char *ecoStr, bool extensions)
uint strLength(const char *str)
const char * strTrimLeft(const char *target, const char *trimChars)
const char * strFirstChar(const char *target, char matchChar)
int strUniqueExactMatch(const char *keyStr, const char **strTable, bool exact)
const squareT NULL_SQUARE
char * strDuplicate(const char *original)
ecoT eco_LastSubCode(ecoT eco)
const resultT RESULT_Black
squareT strGetSquare(const char *str)
void strTrimMarkCodes(char *str)
uint strTrimSuffix(char *target, char suffixChar)
const resultT RESULT_Draw
squareT square_Make(fyleT f, rankT r)
ecoT eco_Reduce(ecoT eco)
ecoReduce() - maps eco to a smaller set
uint strPad(char *target, const char *original, int width, char padding)
bool strIsCasePrefix(const char *prefix, const char *longStr)
const resultT RESULT_White
bool strIsSurnameOnly(const char *name)
bool strIsUnknownName(const char *str)
void strGetIntegers(const char *str, int *results, uint nResults)
rankT rank_FromChar(char c)
int strGetInteger(const char *str)
bool strContainsChar(const char *str, char ch)
uint32_t strGetUnsigned(const char *str)
const char * strNextWord(const char *str)
char * strAppend(char *target, const char *extra)
void strTrimMarkup(char *str)
const char * strFirstWord(const char *str)
void strCopyExclude(char *target, const char *original, const char *excludeChars)
flagT strGetFlag(const char *str)
void strCopy(char *target, const char *original)
ecoT eco_FromString(const char *ecoStr)
resultT strGetResult(const char *str)
ecoT eco_BasicCode(ecoT eco)
bool strGetBoolean(const char *str)
void strGetUnsigneds(const char *str, uint *results, uint nResults)
const resultT RESULT_None
void strStrip(char *str, char ch)
void strTrimDate(char *str)
const char * strLastChar(const char *target, char matchChar)