【将棋】指手を生成するコードを生成するコード2

空いた時間にちまちま作っています。
指手を生成するコードを生成するコードをデバッグした後に、
生成された指手を生成するコードをデバッグしないといけないので大変です。
キャプチャとドロップはなんとかできたけど、王手の回避手を同じように作ると
組み合わせが膨大になりすぎた。
というのは、
王の位置(81)×王手をかける位置(81)×合い駒を打つ持ち駒のパターン(127)で、
王手を回避するパターンを生成しないといけない。


コードだけで、1Gバイトを超えてコンパイルが止まってしまう。
コード例は下にあります。パターンをひたすらswitchで展開していく。



前回も書いたけど、狙いは、いままで配列で駒の利きを計算していたので、その配列参照をなくすことで高速になること、
事前に利きの配列を用意する必要がなく、関数をコピペすればいきなり使える、
というものです。



なにかアホなことしていて、根本的に方針が間違ってるかもしれない。

int *gen_evasion(char *kifu, int *te, char king_pos, char attack_pos)
{
	switch(king_pos)
	{
	case 0: // kpos 
		switch(attack_pos)
		{
		case 9: // attack pos
			switch(kifu[1])
			{
			case KOMA_GI:
				*te++=0x24089;
				*te++=0x20089;
				break;
			case KOMA_KA:
				*te++=0x34089;
				*te++=0x30089;
				break;
			case KOMA_UM:
				*te++=0x68089;
				break;
			case KOMA_RY:
				*te++=0x70089;
				break;
			}
			switch(kifu[10])
			{
			case KOMA_KI:
				*te++=0x28509;
				break;
			case KOMA_HI:
				*te++=0x3c509;
				*te++=0x38509;
				break;
			case KOMA_TO:
				*te++=0x48509;
				break;
			case KOMA_NY:
				*te++=0x50509;
				break;
			case KOMA_NK:
				*te++=0x58509;
				break;
			case KOMA_NG:
				*te++=0x60509;
				break;
			case KOMA_UM:
				*te++=0x68509;
				break;
			case KOMA_RY:
				*te++=0x70509;
				break;
			case KOMA_EMP:
				switch(kifu[11]){
				case KOMA_HI:
					*te++=0x3c589;
					*te++=0x38589;
					break;
				case KOMA_RY:
					*te++=0x70589;
					break;
				case KOMA_EMP:
					switch(kifu[12]){
					case KOMA_HI:
						*te++=0x3c609;
						*te++=0x38609;
						break;
					case KOMA_RY:
						*te++=0x70609;
						break;
					case KOMA_EMP:
						switch(kifu[13]){
						case KOMA_HI:
							*te++=0x3c689;
							*te++=0x38689;
							break;
						case KOMA_RY:
							*te++=0x70689;
							break;
						case KOMA_EMP:
							switch(kifu[14]){
							case KOMA_HI:
								*te++=0x3c709;
								*te++=0x38709;
								break;
							case KOMA_RY:
								*te++=0x70709;
								break;
							case KOMA_EMP:
								switch(kifu[15]){
								case KOMA_HI:
									*te++=0x3c789;
									*te++=0x38789;
									break;