#include <curses.h>
#include <strings.h>
#include "boggle.h"
#include "window.h"

#ifdef __NetBSD__
#define _maxx maxx
#define _maxy maxy
#define _curx curx
#define _cury cury
#define _y lines
#endif

extern char *malloc(), *realloc(), *free();
#define my_realloc(ptr, num) ((ptr) ? realloc(ptr, num) : malloc(num))
#define my_malloc(num) malloc(num)
#define my_free(ptr) if (ptr) free (ptr)
     
dowin_ww(parent, ww, dims)
WINDOW *parent;
WordWindow *ww;
Dimensions dims;
{
     WINDOW *new;
     
     ww->dimensions = dims;

     new = subwin(parent, ww->dimensions.h, ww->dimensions.w,
		  ww->dimensions.y, ww->dimensions.x);
     if (ww->window) {
	  overwrite(ww->window, new);
	  delwin(ww->window);
     }
     ww->window = new;
}


init_ww(ww)
WordWindow *ww;
{
     ww->xpos = ww->ypos = 0;
     ww->words = (w_array) NULL;
     ww->num = 0;
     ww->window = (WINDOW *) NULL;
}

     
put_word_on_ww(ww, word)
WordWindow *ww;
char *word;
{
     int len;

     len = strlen(word);

     if ((ww->xpos + len) > ww->window->_maxx) {
	  ww->xpos = 0;
	  ww->ypos += 1;
     }

     wmove(ww->window, ww->ypos, ww->xpos);
     waddstr(ww->window, word);
     
     ww->xpos += len + 1;

     if (ww->xpos > ww->window->_maxx) {
	  ww->xpos = 0;
	  ww->ypos += 1;
     }
}


add_word_to_ww(ww, word)
WordWindow *ww;
char *word;
{
     put_word_on_ww(ww, word);
#ifndef AUTO_TOUCH
     wrefresh(ww->window);
#endif

     ww->num++;
     ww->words = (w_array) my_realloc((char *) ww->words,
				      (unsigned) MAX_WORD_LENGTH * ww->num);
     strcpy(ww->words[ww->num - 1], word);
}


add_word_to_ww_hl(ww, word)
WordWindow *ww;
char *word;
{
     wstandout(ww->window);
     add_word_to_ww(ww, word);
     wstandend(ww->window);
}


add_word_to_ww_hl_p(ww, word, words, num)
WordWindow *ww;
char *word;
w_array words;
int num;
{
     int i, hl, st;

     for (i = 0, hl = 0; i < num; i++) {
	  if (! (st = strcmp(word, words[i]))) {
	       hl = 1;
	       break;
	  }
	  else if (st > 0)
	       continue;
	  else
	       break;
     }

     if (hl)
	  wstandout(ww->window);
     add_word_to_ww(ww, word);
     if (hl)
	  wstandend(ww->window);
}

     
	       
redraw_ww(ww)
WordWindow *ww;
{
     int i;
     
     werase(ww->window);
     ww->xpos = ww->ypos = 0;
     
     for (i = 0; i < ww->num; i++)
	  put_word_on_ww(ww, ww->words[i]);
	  
#ifndef AUTO_TOUCH
     wrefresh(ww->window);
#endif
}


redraw_ww_hl_p(ww, words, num)
WordWindow *ww;
w_array words;
int num;
{
     int i, j;
     int hl, st;

     werase(ww->window);
     ww->xpos = ww->ypos = 0;
     
     for (i = 0; i < ww->num; i++) {
	  for (hl = 0, j = 0; j < num; j++) {
	       if (! (st = strcmp(ww->words[i], words[j]))) {
		    hl = 1;
		    break;
	       }
	       else if (st > 0)
		    continue;
	       else
		    break;
	  }
	  if (hl)
	       wstandout(ww->window);
	  put_word_on_ww(ww, ww->words[i]);
	  if (hl)
	       wstandend(ww->window);
     }

#ifndef AUTO_TOUCH
     wrefresh(ww->window);
#endif
}




clear_ww(ww)
WordWindow *ww;
{
     ww->xpos = ww->ypos = 0;
     my_free((char *) ww->words);
     ww->num = 0;
     werase(ww->window);
}



#ifdef notdef
test()
{
     WordWindow win;
     Dimensions dim;
     w_array highs;
     int i = 0;
     
     initscr();
     clear();
     refresh();

     dim.w = COLS;
     dim.h = 20;
     dim.x = 0;
     dim.y = 0;
     
     init_ww(stdscr, &win, dim);
     highs = (w_array) my_malloc((unsigned) 20 * MAX_WORD_LENGTH);

#define x(foo) add_word_to_ww(&win, foo)
#define xl(foo) add_word_to_ww_hl(&win, foo);\
     strcpy(highs[i++], foo);
     
     x("10th");
     xl("1st");
     x("2nd");
     x("3rd");
     x("4th");
     x("5th");
     x("6th");
     x("7th");
     x("8th");
     x("9th");
     x("ABA");
     xl("Aaron");
     xl("Ababa");
     x("Abbott");
     x("Abe");
     x("Abel");
     x("Abelian");
     x("Abelson");
     x("Aberdeen");
     x("Abernathy");
     x("Abidjan");
     x("Abigail");
     x("Abner");
     x("Abo");
     x("Abraham");
     x("Abram");
     x("Abramson");
     x("a");
     x("aback");
     xl("abalone");
     x("abandon");
     x("abase");
     x("abash");
     xl("abate");
     x("abbas");
     xl("abbe");
     x("abbey");
     x("abbot");
     x("abbreviate");
     x("abc");
     x("abdicate");
     x("abdomen");
     x("abdominal");
     x("abduct");
     x("abed");
     x("aberrant");
     x("aberrate");
     x("abet");
     x("abetted");
     x("abetting");
     x("abeyance");
     x("abeyant");
     x("abhorred");
     x("abhorrent");
     x("abide");
     x("abject");
     x("ablate");
     x("ablaze");
     x("able");
     x("ablution");
     x("abnormal");
     x("aboard");
     xl("abode");
     x("abolish");
     xl("abolition");
     xl("abominable");
     x("abominate");
     x("aboriginal");
     x("aborigine");
     x("aborning");
     x("abort");
     x("abound");
     x("about");
     x("above");
     x("aboveboard");
     x("aboveground");
     x("abovementioned");
     x("abrade");
     x("abrasion");
     x("abrasive");
     xl("abreact");
     xl("abreast");
     x("abridge");
     x("abridgment");
     x("abroad");
     x("abrogate");
     x("abrupt");
     x("abscess");
     x("abscissa");
     x("abscissae");
     x("absence");
     x("absent");
     x("absentee");
     x("absenteeism");
     x("absentia");
     x("absentminded");
     x("absinthe");
     xl("absolute");
     x("absolution");
     xl("absolve");

     sleep(3);
     redraw_ww(&win);
     sleep(3);
     redraw_ww_hl(&win, highs, i);
}
#endif
