//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // PBook::ReadFile(): read in a file. errorT PBook::ReadFile () { ASSERT (FileName != NULL); ReadOnly = false; MFile fp; if (fp.Open (FileName, FMODE_Both) != OK) { ReadOnly = true; if (fp.Open (FileName, FMODE_ReadOnly) != OK) { return ERROR_FileOpen; } } LineCount = 1; Position * pos = new Position; DString * line = new DString; ReadLine(line, &fp); DString dstr; while (line->Length() || ! fp.EndOfFile()) { if (pos->ReadFromFEN (line->Data()) != OK) { fprintf (stderr, "Error reading line: %u\n", LineCount); LineCount++; line->Clear(); ReadLine(line, &fp); continue; //exit (1); } char * s = (char *) line->Data(); // Skip over first four fields, which were the position: while (*s == ' ') { s++; } for (uint i=0; i < 4; i++) { while (*s != ' ' && *s != 0) { s++; } while (*s == ' ') { s++; } } // Now process each field in turn: while (*s == ';' || *s == ' ') { s++; } dstr.Clear(); while (*s != 0) { while (*s == ';' || *s == ' ') { s++; } bool seenCode = false; while (*s != ';' && *s != 0) { seenCode = true; char ch = *s; // Check for backslash (escape) character: if (ch == '\\') { s++; ch = *s; // "\s" -> semicolon within a field: if (ch == 's') { ch = ';'; } } dstr.AddChar (ch); s++; } if (seenCode) { dstr.AddChar ('\n'); } } if (Insert (pos, dstr.Data()) != OK) { //fprintf (stderr, "Warning: position already exists! Line %u\n", // LineCount); } LineCount++; line->Clear(); ReadLine(line, &fp); } delete pos; delete line; Altered = false; NextIndex = NodeListCount - 1; return OK; }