Skip to content
sudoku.cc 1.74 KiB
Newer Older
Seblu's avatar
Seblu committed
#include <stdlib.h>
Seblu's avatar
Seblu committed
#include <unistd.h>
Seblu's avatar
Seblu committed
#include "sudoku.hh"

Seblu's avatar
Seblu committed
inline static void usage();

Seblu's avatar
Seblu committed
int main(int argc, char *argv[])
{
Seblu's avatar
Seblu committed
  int opt;
Seblu's avatar
Seblu committed
  char *cmpfile = 0;
Seblu's avatar
Seblu committed

Seblu's avatar
Seblu committed
  while ((opt = getopt(argc, argv, "hvxc:")) != -1)
Seblu's avatar
Seblu committed
    switch (opt) {
    case 'v': Grid::verbose = true; break;
    case 'x': Grid::advprint = true; break;
Seblu's avatar
Seblu committed
    case 'c': cmpfile = optarg; break;
    case 'h':
Seblu's avatar
Seblu committed
    default: usage();
    }
Seblu's avatar
Seblu committed
  if (!argv[optind])
    usage();
Seblu's avatar
Seblu committed
  Grid *grid = new Grid();
Seblu's avatar
Seblu committed
  try {
    grid->load(argv[optind]);
    if (cmpfile) {
      Grid *grid2 = new Grid();
      grid2->load(cmpfile);
      if (*grid == *grid2) {
	if (Grid::verbose)
	  std::cout << "Grids are the same." << std::endl;
	return EXIT_FOUND;
      }
      if (Grid::verbose)
	std::cout << "Grids are differents." << std::endl;
	return EXIT_NOTFOUND;
    }
    if (Grid::verbose) {
      std::cout << "Loaded grid:" << std::endl;
      grid->print();
    }
    grid->solve();
Seblu's avatar
Seblu committed
    grid->print();
Seblu's avatar
Seblu committed
  }
Seblu's avatar
Seblu committed
  catch (const Error &e) {
    std::cerr << e.message() << std::endl;
    if (Grid::verbose)
      grid->print();
    return e.code();
  }
  sstream info;
  if (grid->check(info)) {
Seblu's avatar
Seblu committed
    if (Grid::verbose)
      std::cout << "Solution found." << std::endl;
    return EXIT_FOUND;
  }
Seblu's avatar
Seblu committed
  if (Grid::verbose) {
    std::cout << "Checking: " << info.str() << std::endl;
    std::cout << "No suitable solution found." << std::endl;
  }
Seblu's avatar
Seblu committed
  return EXIT_NOTFOUND;
Seblu's avatar
Seblu committed
}

Seblu's avatar
Seblu committed
inline static void usage()
{
Seblu's avatar
Seblu committed
  std::cerr << "Usage: sudoku [-vx] [-c file2] file" << std::endl;
  std::cerr << "Options:   -h: Print usage" << std::endl;
  std::cerr << "           -v: Verbose mode" << std::endl;
Seblu's avatar
Seblu committed
  std::cerr << "           -x: eXtended print mode" << std::endl;
Seblu's avatar
Seblu committed
  std::cerr << "           -c file2: compare file and file2" << std::endl;
Seblu's avatar
Seblu committed
  exit(EXIT_USAGE);
}