home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR2 / CBUFF09.ZIP / SRC.ZIP / VERIFY.C < prev   
C/C++ Source or Header  |  1993-11-16  |  6KB  |  245 lines

  1. /*  $Id$
  2.  *  
  3.  *  File    verify.c
  4.  *  Part of    ChessBase utilities file format (CBUFF)
  5.  *  Author    Anjo Anjewierden, anjo@swi.psy.uva.nl
  6.  *  Purpose    Verify utility
  7.  *  Works with    GNU CC 2.4.5
  8.  *  
  9.  *  Notice    Copyright (c) 1993  Anjo Anjewierden
  10.  *  
  11.  *  History    05/10/93  (Created)
  12.  *          10/11/93  (Last modified)
  13.  */ 
  14.  
  15.  
  16. /*------------------------------------------------------------
  17.  *  Directives
  18.  *------------------------------------------------------------*/
  19.  
  20. #include "cbuff.h"
  21.  
  22. char *        UTILITY_NAME = "Verify utility";
  23. char *        UTILITY_VERSION = "1.1.0";
  24.  
  25. void        helpUtility(FILE *fd);
  26.  
  27. bool        VERIFY_HEADER = TRUE;
  28. bool        VERIFY_MOVES = TRUE;
  29. bool        VERIFY_NAMES = FALSE;
  30. bool        VERIFY_INDEX = FALSE;
  31.  
  32.  
  33. /*------------------------------------------------------------
  34.  *  Verify utility
  35.  *------------------------------------------------------------*/
  36.  
  37. void
  38. verifyUtility(Option opt)
  39. { Game g = newGame();
  40.   CBase cb = opt->database;
  41.   long from = opt->from;
  42.   long to = (opt->to < getNoGamesCBase(cb) ? opt->to : getNoGamesCBase(cb));
  43.   long count;
  44.   long n;
  45.   long inc;
  46.   unsigned long nextIndex = 0L;        /* Next index expected */
  47.   unsigned long bytesWasted = 0L;    /* Bytes wasted */
  48.   unsigned long gamesDisplaced = 0L;    /* Games with incorrect order */
  49.  
  50.   reportCBase(cb, stderr);
  51.  
  52.   n = to-from+1;
  53.   if (n < 0)
  54.     return;
  55.   inc = (n < 50L ? 1 : n / 50);
  56.   
  57.   for (n=from, count=0; n<=to; n++, count++)
  58.   { if (inc == count)
  59.     { fprintf(stderr, ".");
  60.       count = 0;
  61.     }
  62.  
  63.     environmentError(cb, g, n);
  64.     initialiseGame(g, n, cb);
  65.     if (foundError())
  66.     { reportError(stderr);
  67.       continue;
  68.     }
  69.     
  70.     if (VERIFY_INDEX == TRUE)
  71.     { unsigned long index;
  72.  
  73.       index = getIndexGameCBase(cb, n);
  74.       if (foundError())
  75.       { reportError(stderr);
  76.     continue;
  77.       }
  78.     
  79.       if (index < nextIndex)
  80.       { fprintf(stderr, "\nGame %6ld: Game is displaced (%ld, %ld)",
  81.         n, nextIndex, index);
  82.     gamesDisplaced++;
  83.       }
  84.       if (index > nextIndex)
  85.       { fprintf(stderr, "\nGame %6ld: %ld bytes wasted (%ld, %ld)",
  86.         n, (index-nextIndex), nextIndex, index);
  87.     bytesWasted += (index - nextIndex);
  88.       }
  89.       if (index >= nextIndex)
  90.     nextIndex = index + bytesGame(g);
  91.     }
  92.  
  93.     if (VERIFY_HEADER == TRUE)
  94.     { checkHeaderGame(g);
  95.       if (foundError())
  96.       { reportError(stderr);
  97.     continue;
  98.       }
  99.     }
  100.  
  101.     if (VERIFY_MOVES == TRUE)
  102.     { getFirstMoveGame(g);
  103.       if (foundError())
  104.       { reportError(stderr);
  105.     continue;
  106.       }
  107.     }
  108.  
  109.     if (VERIFY_NAMES == TRUE)
  110.     { char name[MAX_NAME_SIZE+1];
  111.  
  112.       if (getBlackGame(g) == NULL || getWhiteGame(g) == NULL)
  113.       { fprintf(stderr, "Game %6ld: Could not extract player names\n", n);
  114.     fprintf(stderr, "             -- Players: %s\n", getPlayersGame(g));
  115.     continue;
  116.       }
  117.       
  118.       stringChessSymbol(getPlayersGame(g), name);
  119.       if (foundError())
  120.       { reportError(stderr);
  121.         continue;
  122.       }
  123.       
  124.       stringChessSymbol(getSourceGame(g), name);
  125.       if (foundError())
  126.       { reportError(stderr);
  127.     continue;
  128.       }
  129.     }
  130.   }
  131.   fprintf(stderr, "\n");
  132.  
  133.   if (VERIFY_INDEX)
  134.   { fprintf(stderr, "Games displaced:  %6ld\n", gamesDisplaced);
  135.     fprintf(stderr, "Bytes wasted:     %6ld\n", bytesWasted);
  136.     if (gamesDisplaced || bytesWasted)
  137.       fprintf(stderr, "Use ``cuclean'' to correct the above\n");
  138.   }
  139.  
  140.   freeGame(g);
  141. }
  142.  
  143.  
  144. /*------------------------------------------------------------
  145.  *  Main
  146.  *------------------------------------------------------------*/
  147.  
  148. int
  149. main(int argc, char *argv[])
  150. { int i;
  151.   Option options = newOption();
  152.  
  153.   initChessSymbols();
  154.  
  155.   for (i=1; i<argc; i++)
  156.   {
  157.     if (strhead(argv[i], "-verify"))
  158.     { VERIFY_MOVES = TRUE;
  159.       VERIFY_HEADER = TRUE;
  160.       continue;
  161.     }
  162.  
  163.     if (strhead(argv[i], "-noverify"))
  164.     { VERIFY_MOVES = FALSE;
  165.       VERIFY_HEADER = FALSE;
  166.       continue;
  167.     }
  168.  
  169.     if (strhead(argv[i], "-moves"))
  170.     { VERIFY_MOVES = TRUE;
  171.       continue;
  172.     }
  173.  
  174.     if (strhead(argv[i], "-nomoves"))
  175.     { VERIFY_MOVES = FALSE;
  176.       continue;
  177.     }
  178.  
  179.     if (strhead(argv[i], "-names"))
  180.     { VERIFY_NAMES = TRUE;
  181.       continue;
  182.     }
  183.  
  184.     if (strhead(argv[i], "-nonames"))
  185.     { VERIFY_NAMES = FALSE;
  186.       continue;
  187.     }
  188.  
  189.     if (strhead(argv[i], "-index"))
  190.     { VERIFY_INDEX = TRUE;
  191.       continue;
  192.     }
  193.  
  194.     if (strhead(argv[i], "-noindex"))
  195.     { VERIFY_INDEX = FALSE;
  196.       continue;
  197.     }
  198.  
  199.     if (strhead(argv[i], "-"))
  200.     { int n;
  201.  
  202.       n = genericOption(options, argv, argc, i);
  203.       if (n == 0)
  204.       { fprintf(stderr, "Fatal: Unknown command %s\n", argv[i]);
  205.     fprintf(stderr, "Do ``%s -help'' or see the documentation\n", argv[0]);
  206.     exit(1);
  207.       }
  208.       i = n;
  209.       continue;
  210.     }
  211.  
  212.     setCurrentCBase(argv[i], "-database", argc, i);
  213.     options->database = CurrentBase;
  214.     verifyUtility(options);
  215.     freeCBase(options->database);
  216.     options->database = (CBase) NULL;
  217.   }
  218.  
  219.   if (options->database)
  220.   { verifyUtility(options);
  221.     freeCBase(options->database);
  222.   }
  223.  
  224.   return 0;
  225. }
  226.  
  227.  
  228. /*------------------------------------------------------------
  229.  *  Help
  230.  *------------------------------------------------------------*/
  231.  
  232. void
  233. helpUtility(FILE *fd)
  234. { helpCBUFF(fd);
  235.   fprintf(fd, "%s options:\n", UTILITY_NAME);
  236.   fprintf(fd, "-index        Verifies index entries for gaps\n");
  237.   fprintf(fd, "-moves        Verifies moves (default)\n");
  238.   fprintf(fd, "-names        Verifies names of players and source\n");
  239.   fprintf(fd, "-noindex      Does not verify index entries for gaps (default)\n");
  240.   fprintf(fd, "-nomoves      Does not verify moves\n");
  241.   fprintf(fd, "-nonames      Does not verify names of players and source (default)\n");
  242.   fprintf(fd, "-noverify     Does not verify header and moves\n");
  243.   fprintf(fd, "-verify       Verifies header and moves (default)\n");
  244. }
  245.