
#include <math.h>
#include <complex.h>
#include <system.hpp>
#include <list.h>
#include <vcl.h>


/* Const *********************************************************************/

enum
{
	TFSUCCESS = 0,
	TFFAILD
};


/* Primitive Library *********************************************************/

class	TFLib
{
public:

	/*
	 *	ソース書き込み
	 */

	/* 複素数を AnsiString に変換する */
	static AnsiString _fastcall ToAnsiString (complex<double> z)
	{
		return ("(" + AnsiString(real(z)) + ", " + AnsiString(imag(z)) + ")");
	}


	/*
	 *	ソース読み込み
	 */

	/* 空白をスキップする */
	static void __fastcall SkipSpace(AnsiString *src)
	{
		int		n = 1;

		while (src->IsDelimiter(" \t", n)) n++;
		n--;
		src->Delete (1, n);
	}

	/* 空白と '\n' をスキップする */
	static void __fastcall SkipSpaceCR(AnsiString *src)
	{
		int		n = 1;

		while (src->IsDelimiter(" \t\r\n", n)) n++;
		n--;
		src->Delete (1, n);
	}

	/* 特定文字をスキップする */
	static bool __fastcall SkipChar(AnsiString *src, char c)
	{
		SkipSpace (src);
		if ((*src)[1] != c) return (TFFAILD);
		src->Delete (1, 1);
		return (TFSUCCESS);
	}

	/* ワードをスキップする */
	static bool __fastcall SkipWord(AnsiString *src, AnsiString skipword)
	{
		AnsiString	word;
		int		n = 1;

		SkipSpace (src);
		while (!src->IsDelimiter(" \t\r\n", n) && (src->c_str())[n] != '\0') n++;
		n--;
		word = src->SubString(1, n);
		if (word != skipword) return (TFFAILD);
		src->Delete (1, n);
		return (TFSUCCESS);
	}

	/* ワードを取得する */
	static AnsiString __fastcall GetWord(AnsiString *src)
	{
		AnsiString	word;
		int		n = 1;

		SkipSpace (src);
		while (!src->IsDelimiter(" \t\r\n", n) && (src->c_str())[n] != '\0') n++;
		n--;
		word = src->SubString(1, n);
		src->Delete (1, n);
		return (word);
	}

	/* 数値を取得する */
	static bool __fastcall GetNumber(AnsiString *src, double *x)
	{
		AnsiString	word;
		int		n = 1;

		SkipSpace (src);
		while (src->IsDelimiter("-0123456789.", n)) n++;
		n--;
		word = src->SubString(1, n);
		if (word == "") return (TFFAILD);
		src->Delete (1, n);
		*x = word.ToDouble();
		return (TFSUCCESS);
	}

	/* 複素数を取得する */
	static bool __fastcall GetComplex(AnsiString *src, complex<double> *z)
	{
		double		real, imag;

		if (SkipChar(src, '(')) return (TFFAILD);
		if (GetNumber(src, &real)) return (TFFAILD);
		if (SkipChar(src, ',')) return (TFFAILD);
		if (GetNumber(src, &imag)) return (TFFAILD);
		if (SkipChar(src, ')')) return (TFFAILD);
		*z = complex<double>(real, imag);
		return (TFSUCCESS);
	}


	/*
	 *	色変換
	 */

	/* RGB を Color に変換する */
	static TColor __fastcall ToColor(int r, int g, int b)
	{
		TColor	color;

		color = (TColor)(r | (g<<8) | (b<<16));
		return (color);
	}

	/* Color を RGB に変換する */
	static void __fastcall ToRGB(TColor color, int *r, int *g, int *b)
	{
		*r =  color        & 0xff;
		*g = (color >>  8) & 0xff;
		*b = (color >> 16) & 0xff;
	}

	/* R G B の正規化 */
	static void __fastcall RegularRGB(int *r, int *g, int *b)
	{
		if (*r < 0) *r = 0;
		if (*g < 0) *g = 0;
		if (*b < 0) *b = 0;

		if (*r > 255 || *g > 255 || *b > 255)
		{
			int	max_bright;

			max_bright = *r;
			if (max_bright < *g) max_bright = *g;
			if (max_bright < *b) max_bright = *b;
			*r = *r*255/max_bright;
			*g = *g*255/max_bright;
			*b = *b*255/max_bright;
		}
	}

};


/* End of Program ************************************************************/


