////////////////////
// BCCMaker User.h
////////////////////
//------------------
//ファイル起動用変数
//------------------
int g_ByFile = FALSE;			//初期値

//------------------
//サイズ変更用の変数
//------------------
POINT g_idc_detail;				//詳細ボタンのx, y座標
int g_detail_wd, g_detail_ht;	//詳細ボタンの幅、高さ
POINT g_righside[9];			//右側コントロールのX, Y座標
POINT g_idc_output;				//アウトプットエディットボックスのx, y座標

//---------------
//グローバル変数
//---------------
//システム関係（iniファイル用）
CSTR g_OwnPath;		//BCCMakerフォールダーへのパス
CSTR g_IniFile;		//MCCMaker.iniファイルのパス・ファイル名
CSTR g_Make;		//make.exeのパス・ファイル名
CSTR g_Bcc32;		//bcc32.exeのパス・ファイル名
CSTR g_Brc32;		//brc32.exeのパス・ファイル名
CSTR g_Asm;			//アッセンブラーのパス・ファイル名
CSTR g_Edit;		//エディターのパス・ファイル名
CSTR g_Prj;			//makeファイル（*.mak）のパス・ファイル名
bool g_OutDir;		//makeファイル（*.mak）の出力ディレクトリー(TRUE - Release, FALSE - Debug)
CSTR g_InclPath;	//Includeファイルのパス名
CSTR g_Copt;		//bcc32のオプション
CSTR g_Ropt;		//brc32のオプション
CSTR g_Aopt;		//Asmのオプション
CSTR g_HelpFile;	//ヘルプファイルへのパス
HTREEITEM g_hTreeCPP, g_hTreeRC, g_hTreeASM, g_hTreeOBJ, g_hTreeLIB;

//---------------------
//Makeダイアログの初期化
//---------------------
void InitDialog(HWND hWnd)
{
	//☆ツリービューのすべてのアイテムを削除
	tv.DeleteAllItems();
	//☆ファイルカテゴリーの設定
	g_hTreeCPP = tv.InsertItem("CPPファイル", TVI_LAST, TVI_ROOT, 0, 1);
	g_hTreeRC  = tv.InsertItem("RCファイル",  TVI_LAST, TVI_ROOT, 0, 2);
	g_hTreeASM = tv.InsertItem("ASMファイル", TVI_LAST, TVI_ROOT, 0, 3);
	g_hTreeOBJ = tv.InsertItem("OBJファイル", TVI_LAST, TVI_ROOT, 0, 4);
	g_hTreeLIB = tv.InsertItem("LIBファイル", TVI_LAST, TVI_ROOT, 0, 5);
	return;
}

//-------------------
//Makeファイルを読む
//-------------------
bool ReadMakeFile(char* FileName) {

	CSTR Buff, Line;			//ファイル読込用CSTR変数
	Buff.FromFile(FileName);	//ファイル読込み
	char* cp;					//各行の文字列ポインター
	bool Flag;					//OBJフィルの識別フラグ
	HTREEITEM tvParent;			//指定カテゴリーアイテム
	//読み取り開始
	while(Buff.GetLine(Line)) {
		if(cp = strstr(Line.ToChar(), "CFLAG="))
			g_Copt = cp + 6;
			if(cp = strstr(g_Copt.ToChar(), "\r\n"))
				*cp = NULL;
		else if(cp = strstr(Line.ToChar(), "RFLAG="))
			g_Ropt = cp + 6;
			if(cp = strstr(g_Ropt.ToChar(), "\r\n"))
				*cp = NULL;
		else if(cp = strstr(Line.ToChar(), "AFLAG="))
			g_Aopt = cp + 6;
			if(cp = strstr(g_Aopt.ToChar(), "\r\n"))
				*cp = NULL;
		else if(cp = strstr(Line.ToChar(), "OUTDIR=-nRelease"))
			g_OutDir = TRUE;
		else if(cp = strstr(Line.ToChar(), "OUTDIR=-nDebug"))
			g_OutDir = FALSE;
		else if(cp = strstr(Line.ToChar(), "CINCS=")) {
			Line = cp + 6;
			*strstr(Line.ToChar(), "\r\n") = NULL;
			if(*Line.ToChar())
				Line = Line.ToChar() + 2;		//"-I"をスキップ
				Line.Next(g_InclPath);			//""を外す
		}
		else {									//ファイル情報の読取り
			cp = strstr(Line.ToChar(), "=");	//'='があるかどうか調べる
			if(cp) {							//あればファイル部分以降をLineに代入
				Line = cp + 1;
				CSTR Token;
				Line.Next(Token);				//最初の部分がファイルパス・名
				if(strstr(Token.ToChar(), ".cpp") || strstr(Token.ToChar(), ".CPP")) {
					tvParent = g_hTreeCPP;
					Flag = TRUE;				//この後の.objは無視する
				}
				else if(strstr(Token.ToChar(), ".rc") || strstr(Token.ToChar(), ".RC"))
					tvParent = g_hTreeRC;
				else if(strstr(Token.ToChar(), ".asm") || strstr(Token.ToChar(), ".ASM")) {
					tvParent = g_hTreeASM;
					Flag = TRUE;				//この後の.objは無視する
				}
				else if(strstr(Token.ToChar(), ".obj") || strstr(Token.ToChar(), ".OBJ")) {
					if(Flag) {
						Flag = !Flag;
						continue;				//cpp、asmのobjファイルは無視してスキップ
					}
					tvParent = g_hTreeOBJ;
				}
				else if(strstr(Token.ToChar(), ".lib") || strstr(Token.ToChar(), ".LIB"))
					tvParent = g_hTreeLIB;
				else	continue;				//それ以外の行はスキップ
				tv.InsertItem(Token.ToChar(), TVI_LAST, tvParent, 6, 6);
				tv.Expand(tvParent, TVE_EXPAND);
			}
		}
	}
	return TRUE;
}

//------------------------------
//ソースファイルをobj/resに変換
//------------------------------
void Src2BIn(bool sign, char* src) {

	CSTR OutDir;
	if(sign)	OutDir = "\\Release";
	else		OutDir = "\\Debug";
	char* cp;
	for(cp = src + lstrlen(src); *cp != '\\'; cp--);
	OutDir = OutDir + cp;
	lstrcpy(cp, OutDir.ToChar());
	if(cp = strstr(src, ".cpp")) {
		lstrcpy(cp, ".obj");
	}
	else if(cp = strstr(src, ".CPP")) {
		lstrcpy(cp, ".obj");
	}
	else if(cp = strstr(src, ".rc")) {
		lstrcpy(cp, ".res");
	}
	else if(cp = strstr(src, ".RC")) {
		lstrcpy(cp, ".res");
	}
	else if(cp = strstr(src, ".asm")) {
		lstrcpy(cp, ".obj");
	}
	else if(cp = strstr(src, ".ASM")) {
		lstrcpy(cp, ".obj");
	}
}

//-------------------
//Makeファイルを書く
//-------------------
void WriteMakeFile(char* FileName) {

	char Buff[MAX_PATH * 32];	//260 * 32 = 8.3Kのファイルバッファ
	char Temp[MAX_PATH];		//作業用バッファ
	CSTR str;					//作業用CSTR
	int i, n = 0;				//書込み用サイズ変数
	//Makeファイル記述開始
	i = wsprintf(Buff,
				"#-----------------------------\r\n"
				"# BCCMaker 1.0\r\n"
				"# Copyright (C) 2002 by ysama\r\n"
				"#-----------------------------\r\n"
				".autodepend\r\n");
	n = n + i;
	i = wsprintf(Buff + n,
				"CC=\"%s\"\r\n",
				g_Bcc32.ToChar());
	n = n + i;
	i = wsprintf(Buff + n,
				"RC=\"%s\"\r\n",
				g_Brc32.ToChar());
	n = n + i;
	i = wsprintf(Buff + n,
				"ASM=\"%s\"\r\n",
				g_Asm.ToChar());
	n = n + i;
	i = wsprintf(Buff + n,
				"CFLAG=%s\r\n",
				g_Copt.ToChar());
	n = n + i;
	i = wsprintf(Buff + n,
				"RFLAG=%s\r\n",
				g_Ropt.ToChar());
	n = n + i;
	i = wsprintf(Buff + n,
				"AFLAG=%s\r\n",
				g_Aopt.ToChar());
	n = n + i;
	if(g_OutDir) {
		i = wsprintf(Buff + n, "OUTDIR=-nRelease\r\n");
		n = n + i;
	}
	else {
		i = wsprintf(Buff + n, "OUTDIR=-nDebug\r\n");
		n = n + i;
	}
	if(*g_InclPath.ToChar()) {
		i = wsprintf(Buff + n,
					"CINCS=-I\"%s\"\r\n",
					g_InclPath.ToChar());
		n = n + i;
	}
	str = g_Prj;
	lstrcpy(strstr(str.ToChar(), ".mak"), ".exe");	//g_Prj(mak)を"exe"に変える
	i = wsprintf(Buff + n,
				"TARGET=\"%s\"\r\n",
				str.ToChar());
	n = n + i;
	//メイクするファイル、パスを記述
	int nCPP = 1, nRC = 1, nASM = 1, nOBJ = 1, nLIB = 1;	//ファイル数のカウンター
	HTREEITEM hTItem, hCItem;
	hTItem = tv.GetRoot();									//ルートを取る
	while(hTItem) {
		hCItem = tv.GetChild(hTItem);						//その最初の子アイテム
		while(hCItem) {
			tv.GetItem(hCItem, Temp, MAX_PATH);
			if(strstr(Temp, ".cpp") || strstr(Temp, ".CPP")) {
				i = wsprintf(Buff + n,
							"SRC%d=\"%s\"\r\n",
							nCPP, Temp);
				n = n + i;
				Src2BIn(g_OutDir, Temp);					//ソースファイルをobj/resに変換
				str=Temp;
				i = wsprintf(Buff + n,
							"OBJ%d=\"%s\"\r\n",
							nOBJ, Temp);
				n = n + i;
				nCPP++;	nOBJ++;
			}
			else if(strstr(Temp, ".rc") || strstr(Temp, ".RC")) {
				i = wsprintf(Buff + n,
							"RC%d=\"%s\"\r\n",
							nRC, Temp);
				n = n + i;
				Src2BIn(g_OutDir, Temp);					//ソースファイルをobj/resに変換
				i = wsprintf(Buff + n,
							"RES%d=\"%s\"\r\n",
							nRC, Temp);
				n = n + i;
				nRC++;
			}
			else if(strstr(Temp, ".asm") || strstr(Temp, ".ASM")) {
				i = wsprintf(Buff + n,
							"SRA%d=\"%s\"\r\n",
							nASM, Temp);
				n = n + i;
				Src2BIn(g_OutDir, Temp);					//ソースファイルをobj/resに変換
				i = wsprintf(Buff + n,
							"OBJ%d=\"%s\"\r\n",
							nOBJ, Temp);
				n = n + i;
				nASM++;	nOBJ++;
			}
			else if(strstr(Temp, ".obj") || strstr(Temp, ".OBJ")) {
				i = wsprintf(Buff + n,
							"OBJ%d=\"%s\"\r\n",
							nOBJ, Temp);
				n = n + i;
				nOBJ++;
			}
			else if(strstr(Temp, ".lib") || strstr(Temp, ".LIB")) {
				i = wsprintf(Buff + n,
							"LIBJ%d=\"%s\"\r\n",
							nLIB, Temp);
				n = n + i;
				nLIB++;
			}
			hCItem= tv.GetNext(hCItem);
		}
		hTItem= tv.GetNext(hTItem);
	}
	//メイクの仕方を記述
	i = wsprintf(Buff + n, "\r\nTARGET: $(TARGET)\r\n");
	n = n + i;
	i = wsprintf(Buff + n, "$(TARGET):");
	n = n + i;
	for(int j = 1; j < nOBJ; j++) {
		i = wsprintf(Buff + n, " $(OBJ%d)", j);
		n = n + i;
	}
	for(int j = 1; j < nRC; j++) {
		i = wsprintf(Buff + n, " $(RES%d)", j);
		n = n + i;
	}
	i = wsprintf(Buff + n, "\r\n");
	n = n + i;
	i = wsprintf(Buff + n, "    $(CC) $(CFLAG) -e$(TARGET)");
	n = n + i;
	for(int j = 1; j < nOBJ; j++) {
		i = wsprintf(Buff + n, " $(OBJ%d)", j);
		n = n + i;
	}
	for(int j = 1; j < nLIB; j++) {
		i = wsprintf(Buff + n, " $(LIB%d)", j);
		n = n + i;
	}
	i = wsprintf(Buff + n, "\r\n");
	n = n + i;
	if(nRC > 1) {
		i = wsprintf(Buff + n, "    $(RC) $(RESINCS)");
		n = n + i;
	}
	for(int j = 1; j < nRC; j++) {
		i = wsprintf(Buff + n, " $(RES%d)", j);
		n = n + i;
	}
	i = wsprintf(Buff + n, " $(TARGET)\r\n");
	n = n + i;
	for(int j = 1; j < nCPP; j++) {
		i = wsprintf(Buff + n,	"$(OBJ%d): $(SRC%d)\r\n"
								"    $(CC) $(CFLAG) $(CINCS) -o$(OBJ%d) -c $(SRC%d)",
								j, j, j, j);
		n = n + i;
		i = wsprintf(Buff + n, "\r\n");
		n = n + i;
	}
	for(int j = 1; j < nASM; j++) {
		i = wsprintf(Buff + n,	"$(OBJ%d): $(SRA%d)\r\n"
								"    $(ASM) $(AFLAG) -fo$(OBJ%d) $(SRA%d)",
								nCPP + j - 1, j, nCPP + j -1, j);
		n = n + i;
		i = wsprintf(Buff + n, "\r\n");
		n = n + i;
	}
	for(int j = 1; j < nRC; j++) {
		i = wsprintf(Buff + n,	"$(RES%d): $(RC%d)\r\n"
								"    $(RC) $(RESINCS) $(RFLAG) -fo$(RES%d) $(RC%d)",
								j, j, j, j);
		n = n + i;
		i = wsprintf(Buff + n, "\r\n");
		n = n + i;
	}
	//ファイルの書込み
	CSTR wfile(Buff);
	wfile.ToFile(FileName);
}
