#ident "$Id: sudokuCGI.c,v 1.7 2011/05/02 23:07:35 pwh Exp $"
/*
 * Sudoku Puzzle Solver.
 */

#include        <stdio.h>
#include	<stdlib.h>
#include	<string.h>

#include	"cgi.h"
#include	"puzzle.h"

#if	defined(DEBUG)
FILE *logFile = NULL;
#endif


int main ( int argc, char **argv, char **envp )

{
   int		status = 0;
   PUZZLE	*puzzle;
   CGIparams	*params = NULL;
   char		*clues = NULL;

#if	defined(DEBUG)
   char		*logFileName;

   logFileName = (char *) malloc ( strlen ( argv [0] ) + 5 );
   strcpy ( logFileName, argv [0] );
   strcpy ( logFileName + strlen ( logFileName ), ".log" );
   logFile = fopen ( logFileName, "w" );

#endif

   if ( argc > 1 ) clues = *++argv;
   else {

	params = openCGIparams ( envp );
	if ( params ) {

		if ( clues = getCGIparam ( params, "clues" ) )
				printf ( "Content-type: text/plain\n\n" );
	}
   }

   while ( clues ) {

	if ( puzzle = openPuzzleSolver ( clues ) ) {

		status = solvePuzzle ( puzzle, NULL );

		fprintf ( stdout, "%d\n", status );

		if ( status ) {

			int	row;

			fprintf ( stdout, "%d\n", puzzle->difficulty );

			if ( status > 1 ) {

				fprintf ( stdout, "Ambiguous\n" );

			} else if ( puzzle->technique & WHAT_IF ) {

				fprintf ( stdout, "Expert\n" );

			} else if ( puzzle->technique
				& ( NAKED_TUPLE | HIDDEN_TUPLE ) ) {

				fprintf ( stdout, "Hard\n" );

			} else if ( puzzle->technique & SET_INTERSECTION ) {

				fprintf ( stdout, "Medium\n" );

			} else fprintf ( stdout, "Easy\n" );

			for ( row = 0; row < 9; ++row ) {

				int	column;

				for ( column = 0; column < 9; ++column ) {

					fputc ( puzzle->grid [row][column]
								+ '0', stdout );
				}

				fputc ( '\n', stdout );
			}
		}

		closePuzzle ( puzzle );

	} else fprintf ( stdout, "0\n" );

	if ( params ) clues = NULL;
	else clues = *++argv;
   }

   if ( params ) closeCGIparams ( params );

#if	defined(DEBUG)
   fclose ( logFile );
   free ( logFileName );
#endif

   return ( status );
}


Last updated: Friday, June 12, 2015 03:21:43 AM