/*
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 ** http://www.apache.org/licenses/LICENSE-2.0
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 */

#include "training.h"
#include "debug.h"
#include "memry.h"
#include "grphics.h"
#include "evnts.h"

make_int_var    (LearningDebugLevel, 0, MakeLearningDebugLevel,
		18, 5, SetLearningDebugLevel,
		"Learning Debug Level: ");

make_int_var   (NormMethod, character, MakeNormMethod,
					15, 10, SetNormMethod,   "Normalization Method   ...")

//char *demodir;                   /*demo home directory */


void						cprintf(					//Trace printf
const char					*format,...					//special message
)
{
}

char						*c_alloc_string(			//allocate string
INT32						count						//no of chars required
)
{
	return alloc_string(count);
}

void						c_free_string(				//free a string
char						*string						//string to free
)
{
	free_string(string);
}

void						*c_alloc_mem_p(				//allocate permanent space
INT32						count						//block size to allocate
)
{
	return alloc_mem_p(count);
}
void						*c_alloc_mem(				//get some memory
INT32						count						//no of bytes to get
)
{
	return alloc_mem(count);
}
void						c_free_mem(					//free mem from alloc_mem
void						*oldchunk					//chunk to free
)
{
	free_mem(oldchunk);
}
void						c_check_mem(				//check consistency
const char			*string,					//context message
INT8						level						//level of check
)
{
	check_mem(string,level);
}

void*						c_alloc_struct(				//allocate memory
INT32						count,						//no of chars required
const char*					name						//class name
)
{
	return alloc_struct(count,name);
}
void						c_free_struct(				//free a structure
void*						deadstruct,					//structure to free
INT32						count,						//no of bytes
const char*					name						//class name
)
{
	free_struct(deadstruct,count,name);
}

void						c_make_current(				/*move pen*/
void*						win
)
{
  ScrollView* window = (ScrollView*) win;
  window->Update();
}

void						reverse32(
void*						ptr
)
{
	char					tmp;
	char*					cptr=(char*)ptr;

	tmp=*cptr;
	*cptr=*(cptr+3);
	*(cptr+3)=tmp;
	tmp=*(cptr+1);
	*(cptr+1)=*(cptr+2);
	*(cptr+2)=tmp;
}

void						reverse16(
void*						ptr
)
{
	char					tmp;
	char*					cptr=(char*)ptr;

	tmp=*cptr;
	*cptr=*(cptr+1);
	*(cptr+1)=tmp;
}





void*						c_create_window(			/*create a window*/
const char					*name,						/*name/title of window*/
INT16						xpos,						/*coords of window*/
INT16						ypos,						/*coords of window*/
INT16						xsize,						/*size of window*/
INT16						ysize,						/*size of window*/
double						xmin,						/*scrolling limits*/
double						xmax,						/*to stop users*/
double						ymin,						/*getting lost in*/
double						ymax						/*empty space*/
)
{
   return new ScrollView(name, xpos, ypos, xsize, ysize, xmin + xmax, ymin + ymax, true);
}
void						c_line_color_index(			/*set color*/
void*						win,
C_COL						index
)
{
 // The colors are the same as the SV ones except that SV has COLOR:NONE --> offset of 1
 ScrollView* window = (ScrollView*) win;
 window->Pen((ScrollView::Color) (index + 1));
}
void						c_move(						/*move pen*/
void*						win,
double						x,
double						y
)
{
  ScrollView* window = (ScrollView*) win;
  window->SetCursor((int) x, (int) y);
}
void						c_draw(						/*move pen*/
void*						win,
double						x,
double						y
)
{
  ScrollView* window = (ScrollView*) win;
  window->DrawTo((int) x, (int) y);
}
void						c_clear_window(				/*move pen*/
void*						win
)
{
  ScrollView* window = (ScrollView*) win;
  window->Clear();
}
char						window_wait(				/*move pen*/
void*						win
)
{
	  ScrollView* window = (ScrollView*) win;
  SVEvent* ev;

  // Wait till an input event (all others are thrown away)
  ev = window->AwaitEvent(SVET_ANY);
  char ret = '\0';
  if (ev->type == SVET_INPUT) { ret = ev->parameter[0]; }
  delete ev;
  return ret;
}