/**************************************************************************/
/*                             Hookto   Utility                           */
/*                                                                        */
/*                                 M\Cooper                               */
/*                                PO Box 237                              */
/*                        St. David, AZ 85630-0237                        */
/*                        -------------------------------                 */
/*                        Email:  thegrendel@theriver.com                 */
/*                                                                        */
/*                                                                        */
/**************************************************************************/


#include "srch.h"
#include <ctype.h>

#define FILE_OPENING_ERROR 3
#define FILENAME_MAXLEN 8
#define CR "\n"
#define FILE_SUFFIX ".hk2"
#define MAXLEN 30
#define LINE_LEN 80
#define NOARGS 1
#define INCREMENT 1
#define SPACE ' '
#define WD 8
#define BINGOLEN 8
#define SINGLE 1
#define NULL_ 0
#define MAXSTRLEN 80
#define BLOTTO '@'
#define XOUT '@'
#define WILDCARD '_'
#define FILLCHAR '_'



#define BUFFERSIZE 8192


typedef enum { FALSE, TRUE } Boolean;

void getword( char *boardword, char *lset, char *filename );
char *strsubtract( char *mainstr, char *substr );
Boolean isanagram( char *letterset, char *word );
Boolean wordtest(  char *boardword, char *letterset, char *word );

void main( int argc, char **argv )
{

   char letterset [ MAXLEN ],
        boardword [ MAXLEN ],
        filename [ MAXLEN ];

	 if( argc < NOARGS + 2 )
	    {
	    printf( "\n" );
            printf( "\nEnter the word on the board ... " );
            gets( boardword );
	    puts("Enter your tiles ... " );
	    gets( letterset );
     strcpy( filename, "word.lst" );
	    }
	 else
     if( argc == NOARGS + 2 )
	       {
        strcpy( boardword, *( argv + 1 ) );
        strcpy( letterset, *( argv + 2 ) );
        strcpy( filename, "word.lst" );
        }
   else
     {
     strcpy( boardword, *( argv + 1 ) );
     strcpy( letterset, *( argv + 2 ) );
     strcpy( filename,  *( argv + 3 ) );
     }

	 getword( boardword, letterset, filename );
}



/**********************************WORDTEST********************************/
/* Function tests if word is constructible from Word on Board & Letterset */
/*      Args in: char * onboardword, char *letterset, char *word          */
/*   Returns: error_flag == TRUE (1) if constructible, FALSE (0) if not   */
/**************************************************************************/

Boolean wordtest(  char *onboardword, char *letterset, char *word )
{

   char *diffstr;

      if( !strstr( word, onboardword ) )
         return( FALSE ); 


      diffstr = strsubtract( word, onboardword );
          
      if( !isalpha( *diffstr ) )
         return( FALSE ); 

      if( isanagram( letterset, diffstr ) )
         return( TRUE );  


       return( FALSE );
}

/*************************************************************/
void getword( char *boardword, char *letter_set, char *filename )
{

	char	l_set [ MAXLEN ],
		word [ MAXLEN ],
                bword [ MAXLEN ],
		tempstr [ MAXLEN + 1 ],
		targetfile [ MAXLEN ],
                wd [ WD ];

	FILE *fptr;
	int fnamelen,
            dl;
	long wcount = 0L;



	   strcpy( l_set, letter_set );


	   if( !( fptr = fopen( filename, "rt" ) ) )
		 {
		 printf( "\7\7\7Cannot open Wordfile!" );
		 exit( FILE_OPENING_ERROR );
		 }
      if( setvbuf( fptr, NULL, _IOFBF, BUFFERSIZE ) )
         exit( FILE_OPENING_ERROR + 1 );





		 /*********************Main Loop*************/	 
		  while( fgets( word, MAXLEN, fptr ) != NULL )

			if( wordtest( boardword, letter_set, word ) )
			   {
                           dl = strlen( word ) - strlen( boardword);
                           if( dl >= BINGOLEN )
                               {
                               strcpy( bword, "*" );
                               strcat( bword, word );
                               printf( "%s", bword );
                               }
                           else  
			       printf( "%s", word );
			   wcount++;
			   }
		  /*******************************************/
          
         fclose( fptr );

         return;

}




char *strsubtract( char *mainstr, char *substr )
{
   char buffer_a [MAXSTRLEN],
        buffer_b [MAXSTRLEN],
        *ptrb,
        *dpos;
   register char *t_pos,
                 *ptra;
   static char diffstr [MAXSTRLEN];

      strcpy( buffer_a, mainstr );
      strcpy( buffer_b, substr );
      ptra = buffer_a;
      ptrb = buffer_b;
      dpos = diffstr;

      while( *ptra )
          {
          if( ( t_pos = strchr( buffer_b, *ptra ) ) == NULL )
              {
              *dpos = *ptra;
              dpos++;
               } 
           else 
              *t_pos = BLOTTO;
           ptra++;
          }

         *dpos = 0;


         return( diffstr );

}


/**********************************ISANAGRAM*******************************/
/*       Function tests if word is constructible from Letterset           */
/*                 Args in: char *letterset, char *word                   */
/*   Returns: error_flag == TRUE (1) if constructible, FALSE (0) if not   */
/**************************************************************************/

Boolean isanagram( char *letterset, char *word )
{
	Boolean error_flag = TRUE;
	static char dup_lset[ MAXLEN ];
	register char *letpos;

	 strcpy( dup_lset, letterset );
         strcat( dup_lset, "\n" );

		while( *word )
			{
			if( ( letpos  = strchr( dup_lset, *word++ ) ) != NULL )
				*letpos = XOUT;
      else
         if( ( letpos = strchr( dup_lset, WILDCARD ) ) != NULL ) 
            *letpos = XOUT;

			else
				{ error_flag = FALSE; break; }
			}

		return( error_flag );
}
