Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Bob: tbs parser written

Author: Vincent Lejeune

Date: 02:24:15 12/07/03

Go up one level in this thread


I think it should be interresting to get sub-sum with "white to move" and "black
to move", is it possible ?

On December 06, 2003 at 15:04:14, Anthony Cozzie wrote:

>I didn't see the size of the TB in the TBS file, which is sort of annoying, but
>this program should generate a sorted list of the 6 man tbs and their winning
>percentages (assuming I understand the TBS file correctly).  Could you run it
>and post the results?
>
>anthony
>
>------------------------------------------
>#include "stdio.h"
>#include "dirent.h"
>#include <list>
>
>using namespace std;
>
>struct tbinfo
>{
>  float pct;
>  int size;
>  char id[24];
>
>  bool operator<(struct tbinfo &a) { return pct < a.pct; }
>};
>
>typedef struct tbinfo tbinfo;
>
>//Parses a tbs file into the relevant statistics.
>//returns 1 on error, 0 on success.  Currently assumes
>//all TBs have less than 2^31 wins/draws/losses etc.
>int parse_tbs_file(tbinfo &ti, const char *fname)
>{
>  char buffer[1024];
>  FILE *fp;
>  double wins = 0, draws = 0, losses = 0;
>  int t;
>
>  if(!(fp = fopen(fname, "r"))) return 1;
>
>  while(fgets(buffer, sizeof(buffer), fp) != NULL)
>  {
>    if(     sscanf(buffer, "wtm: Lost in %*d: %d", &t) == 1)
>      losses += t;
>    else if(sscanf(buffer, "btm: Lost in %*d: %d", &t) == 1)
>      wins += t;
>    else if(sscanf(buffer, "wtm: Draws: %d", &t) == 1)
>      draws += t;
>    else if(sscanf(buffer, "btm: Draws: %d", &t) == 1)
>      draws += t;
>    else if(sscanf(buffer, "wtm: Mate in %*d: %d", &t) == 1)
>      wins += t;
>    else if(sscanf(buffer, "btm: Mate in %*d: %d", &t) == 1)
>      losses += t;
>  }
>
>  fclose(fp);
>
>  ti.pct = (float)((wins + draws / 2) / (wins + draws + losses));
>
>  return 0;
>}
>
>int parse_tbs_directory(list<tbinfo> &tbi, const char *dname)
>{
>  char fname_buffer[1024];
>  tbinfo ti;
>  struct dirent *de;
>  DIR *d;
>
>
>  if(!(d = opendir(dname))) return 1;
>
>  while((de = readdir(d)) != NULL) {
>    if(strcmp(".", de->d_name) == 0 || strcmp("..", de->d_name) == 0)
>      continue;
>
>    sscanf(de->d_name, "%[^.]", ti.id);
>    if(strlen(ti.id) > 5) {
>      sprintf(fname_buffer, "%s/%s", dname, de->d_name);
>      parse_tbs_file(ti, fname_buffer);
>      tbi.push_back(ti);
>    }
>  }
>  closedir(d);
>
>  return 0;
>}
>
>int main(int argc, char* argv[])
>{
>  list<tbinfo> tbi;
>
>  if(argc < 2) { printf("Usage: %s [TBS file director]\n", argv[0]); exit(-1); }
>
>  tbi.clear();
>  parse_tbs_directory(tbi, argv[1]);
>  tbi.sort();
>
>  for(list<tbinfo>::iterator i = tbi.begin(); i != tbi.end(); i++)
>    printf("%-6s %.2f%%\n", (*i).id, (*i).pct * 100.0f);
>
>  return 0;
>}



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.