30 epd_findOpcode (
const char * epdStr,
const char * opcode)
32 const char * s = epdStr;
34 while (*s ==
' ' || *s ==
'\n') { s++; }
36 const char *codeEnd = s +
strLength(opcode);
37 if (*codeEnd ==
' ') {
41 while (*s !=
'\n' && *s != 0) { s++; }
54 while (!isalpha(static_cast<unsigned char>(*s)) && *s != 0) {
60 const char* begin = s;
61 while (!isspace(static_cast<unsigned char>(*s)) && *s !=
'\0') {
79 auto range = pos_.equal_range(pos->
HashValue());
80 if (range.first == pos_.end())
81 return std::make_pair(
nullptr,
nullptr);
85 auto it = std::find_if(range.first, range.second,
86 [&](
const std::pair<const unsigned, bookDataT>&
data) {
87 return std::equal(cboard, cboard + 36,
88 data.second.compactStr.get());
90 if (it == range.second)
91 return std::make_pair(
nullptr,
nullptr);
93 const char* end = NULL;
94 const char* begin = epd_findOpcode(it->second.comment.get(),
"eco");
97 while (*end !=
'\0' && *end !=
'\n') {
101 return std::make_pair(begin, end);
110 const char * prevEcoStr =
"";
111 for (
const char* comment : comments_) {
112 const char * ecoStr = epd_findOpcode (comment,
"eco");
113 if (ecoStr != NULL &&
strIsPrefix (ecoPrefix, ecoStr)) {
114 if (depth < 3 &&
strPrefix (ecoStr, prevEcoStr) >= depth+1) {
118 while (*ecoStr !=
'\n' && *ecoStr != 0) {
119 dstr.push_back(*ecoStr);
123 const char* movesStr = epd_findOpcode(comment,
"moves");
124 while (*movesStr !=
'\n' && *movesStr != 0) {
125 dstr.push_back(*movesStr);
128 dstr.push_back(
'\n');
134 std::pair<errorT, std::unique_ptr<PBook> >
137 if (!fp.open(FileName, std::ios::in | std::ios::binary))
140 std::unique_ptr<PBook> pb(
new PBook);
158 if (ch == EOF) { done =
true;
break; }
159 if (ch ==
'\n') { pb->LineCount++; }
160 if (ch >=
'A' && ch <=
'E') {
break; }
162 while (ch !=
'\n' && ch != EOF) {
165 if (ch == EOF) { done =
true; }
174 if (ch < '0' || ch >
'9') {
goto corrupt; }
177 if (ch < '0' || ch >
'9') {
goto corrupt; }
183 if (ch >=
'a' && ch <=
'z') {
184 ecoStr[3] = ch; ecoStr[4] = 0;
186 if (ch >=
'1' && ch <=
'4') {
187 ecoStr[4] = ch; ecoStr[5] = 0;
200 while ((ch = fp.sbumpc()) !=
'"') {
201 if (ch == EOF) {
goto corrupt; }
203 while ((ch = fp.sbumpc()) !=
'"') {
204 if (ch == EOF) {
goto corrupt; }
205 text.push_back((
char) ch);
212 while ((ch = fp.sbumpc()) !=
'*') {
213 if (ch == EOF) {
goto corrupt; }
218 if (ch !=
' ' || prev !=
' ') {
219 moves.push_back((
char) ch);
224 err = ReadLine(pos, moves.c_str());
225 if (err !=
OK) {
goto corrupt; }
226 text.append(
"moves ");
228 text.push_back(
'\n');
230 char* cboard =
new char[36];
232 auto it = pb->pos_.emplace(
234 pb->comments_.push_back(it->second.comment.get());
235 pb->LeastMaterial = std::min(pb->LeastMaterial, pos.
TotalMaterial());
237 return std::pair<errorT, std::unique_ptr<PBook> >(
OK,
std::move(pb));
void PrintCompactStr(char *cboard)
uint strLength(const char *str)
const char * strTrimLeft(const char *target, const char *trimChars)
bool strIsPrefix(const char *prefix, const char *longStr)
static std::pair< errorT, std::unique_ptr< PBook > > ReadEcoFile(const char *FileName)
Read a file with a list of ECO codes and creates a PBook object.
char * strDuplicate(const char *original)
void DoSimpleMove(simpleMoveT *sm)
uint strPrefix(const char *s1, const char *s2)
std::string EcoSummary(const char *ecoPrefix) const
errorT ParseMove(simpleMoveT *sm, const char *str)
void eco_ToExtendedString(ecoT ecoCode, char *ecoStr)
ecoT eco_FromString(const char *ecoStr)
const errorT ERROR_Corrupt
std::pair< const char *, const char * > findECOstr(Position *pos) const
Retrieve an ECO string containing the ECO code and the mnemonic name.
const errorT ERROR_FileOpen
A PBook is a collection of chess positions, each with the corresponding ECO code, a mnemonic name...