From 9142f6d457c896f6bd8e9e0121e35def4f6c5a69 Mon Sep 17 00:00:00 2001 From: kobake Date: Sun, 3 Jun 2018 00:14:43 +0900 Subject: [PATCH] =?UTF-8?q?[wip]=20printf=20=E5=87=BA=E5=8A=9B=E3=83=A1?= =?UTF-8?q?=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=82=92=E8=8B=B1=E8=AA=9E?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ついでにいくつかバグ修正 --- MakefileMake/MakefileMake.cpp | 127 ++++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 52 deletions(-) diff --git a/MakefileMake/MakefileMake.cpp b/MakefileMake/MakefileMake.cpp index 241fc8ac42..3d39f1ac96 100644 --- a/MakefileMake/MakefileMake.cpp +++ b/MakefileMake/MakefileMake.cpp @@ -1,7 +1,7 @@ -/*! @file +/*! @file @author Project Sakura-Editor - @date 2013.04.03 Uchi �쐬 + @date 2013.04.03 Uchi 作成 */ /* Copyright (C) 2013, Uchi @@ -29,16 +29,16 @@ */ /* - ++ �T�v ++ + ++ 概要 ++ - MinGW�p�� makefile �������������邽�߂̃��m + MinGW用の makefile を自動生成するためのモノ - makefile �������������� - ����Ȃ�Ɏ蔲���Ȃ�Ŋ����̃t�@�C�����Ƃ��ɂ͖��Ή� + makefile を自動生成する + 其れなりに手抜きなんで漢字のファイル名とかには未対応 - ++ �g�p���@ ++ + ++ 使用方法 ++ - usage() ���Q�� + usage() を参照 */ #ifdef __MINGW32__ @@ -69,13 +69,14 @@ #undef PREPROCESSOR #define PREPROCESSOR "gcc -x c++ -finput-charset=cp932 -fexec-charset=cp932 -E %s" -void fopen_s( +int fopen_s( FILE** pFile, const char *filename, const char *mode ) { *pFile = fopen(filename, mode); + return pFile != NULL ? 0 : 1; } #endif // __MINGW32__ @@ -95,10 +96,18 @@ void fopen_s( int usage() { - printf("MakefileMake -file= -dir=<�g�b�v�f�B���N�g��>\n"); - printf("���̂̃I�u�W�F�N�g�t�@�C������"); - printf("�g�b�v�f�B���N�g���z����cpp�t�@�C������"); - printf("�I�u�W�F�N�g�t�@�C�����ɂ������ɏ��ւ��܂��B\n"); + // MakefileMake -file= -dir=<トップディレクトリ>\n + // 内ののオブジェクトファイル名を + // トップディレクトリ配下のcppファイル名を + // オブジェクトファイル名にした物に書替えます。\n + + printf( + "Usage: MakefileMake -file= -dir=\n" + "\n" + "MakefileMake replaces .o file lines in the by .cpp file names in the .\n" + "\n" + "NOTICE: will be overwritten by MakefileMake." + ); return 1; } @@ -122,7 +131,7 @@ struct SExpList { std::vector file_list; // filename_list -// �t�@�C�����X�g���쐬���� +// ファイルリストを作成する int makeFileList(std::string top_dir, std::string dir, SExpList sexp) { std::string path; @@ -163,7 +172,7 @@ int makeFileList(std::string top_dir, std::string dir, SExpList sexp) std::string fl_nm; fl_nm = ffData.cFileName; - fl_nm.resize(fl_nm.size() - strlen(sexp.exp)); // �g���q�폜 + fl_nm.resize(fl_nm.size() - strlen(sexp.exp)); // 拡張子削除 if (dir != "") { fl_nm = dir + "/" + fl_nm; } @@ -177,7 +186,7 @@ int makeFileList(std::string top_dir, std::string dir, SExpList sexp) return 0; } -// �t�@�C�����X�g���쐬����(top level) +// ファイルリストを作成する(top level) int makeFileListTop(const char* top_dir) { int res; @@ -190,8 +199,8 @@ int makeFileListTop(const char* top_dir) } -// �t�@�C������‚��Ž��o�� -// �Ō��NULL��Ԃ� +// ファイルを一つずつ取り出す +// 最後はNULLを返す const char* getFile() { static int pt; @@ -208,7 +217,7 @@ const char* getFile() } -// �I�u�W�F�N�g�s1�s�쐬 +// オブジェクト行1行作成 const char* makeObjLine(char* mkline, size_t bf_sz, const char* fl_nm) { sprintf_s( mkline, bf_sz, "%s.o \\\n", fl_nm); @@ -216,10 +225,10 @@ const char* makeObjLine(char* mkline, size_t bf_sz, const char* fl_nm) } -// main�֐� +// main関数 int main(int argc, char* argv[]) { - // �������� + // 引数解釈 const char* makefile = NULL; const char* top_dir = NULL; @@ -252,62 +261,70 @@ int main(int argc, char* argv[]) } } else { - printf("Error: �s���Ȉ���[%s]\n", argv[i]); + // Error: 不明な引数[%s] + printf("Error: Unknown argument[%s]\n", argv[i]); return usage(); } } else { - printf("Error: �s���Ȉ���[%s]\n", argv[i]); + // 不明な引数[%s] + printf("Error: Unknown argument[%s]\n", argv[i]); return usage(); } } if (makefile == NULL && top_dir != NULL) { return usage(); } - if (!makefile) { printf("Error: makefile���w�肵�Ă�������\n\n"); return usage(); } - if (!top_dir) { printf("Error: �g�b�v�f�B���N�g�����w�肵�Ă�������\n\n"); return usage(); } + if (!makefile){ printf("Error: Specify \n\n"); return usage(); } // makefileを指定してください + if (!top_dir) { printf("Error: Specify \n\n"); return usage(); } // トップディレクトリを指定してください - // �g�b�v�f�B���N�g���̃`�F�b�N + // トップディレクトリのチェック struct stat st; int ret = stat( top_dir, &st ); if (ret != 0 || !(st.st_mode & _S_IFDIR)) { - printf("Error: �g�b�v�f�B���N�g��[%s]�����‚���܂���\n", top_dir); + // Error: トップディレクトリ[%s]が見つかりません + printf("Error: Failed to stat TopDirectory[%s].\n", top_dir); return 1; } - // �t�@�C���I�[�v�� + // ファイルオープン FILE* in = NULL; - if (fopen_s( &in, makefile, "rt" ) != 0) { - printf("Error: �o�̓t�@�C��[%s]���J���܂���\n", makefile); + if (fopen_s(&in, makefile, "rt") != 0) { + // Error: 出力ファイル[%s]を開けません + printf("Error: Failed to open Makefile[%s] with read mode.\n", makefile); return 1; } - // �e���|�����t�@�C���̍쐬 + // テンポラリファイルの作成 char tmp_file[_MAX_PATH]; char drive[_MAX_DRIVE], dir[_MAX_DIR]; if (_splitpath_s( makefile, drive, _countof(drive), dir, _countof(dir), NULL, 0, NULL, 0 )) { - printf("Error: �ꎞ�t�@�C���������܂���[%s]\n", makefile); + // Error: 一時ファイル名を作れません[%s] + printf("Error: Failed to generate temporary file path. [makefile:%s]\n", makefile); return 1; } if (_makepath_s( tmp_file, _countof(tmp_file), drive, dir, "mfXXXXXX", NULL )) { - printf("Error: �ꎞ�t�@�C���������܂���[%s, %s]\n", drive, dir); + // Error: 一時ファイル名を作れません[%s, %s] + printf("Error: Failed to generate temporary file path. [drive:%s, dir:%s]\n", drive, dir); return 1; } if (_mktemp_s(tmp_file, _countof(tmp_file))) { - printf("Error: �ꎞ�t�@�C���������܂���[%s]\n", tmp_file); + // Error: 一時ファイル名を作れません[%s] + printf("Error: Failed to generate temporary file path. [tmp_file:%s]\n", tmp_file); return 1; } FILE* out = NULL; - if (fopen_s( &out, tmp_file, "wt" ) != 0) { - printf("Error: �ꎞ�t�@�C��[%s]���J���܂���\n", tmp_file); + if (fopen_s(&out, tmp_file, "wt") != 0) { + // Error: 一時ファイル[%s]を開けません + printf("Error: Failed to open Tmpfile[%s] with write mode.\n", tmp_file); return 1; } - // �t�@�C�����X�g�̍쐬 + // ファイルリストの作成 makeFileListTop(top_dir); - // �t�@�C���̏��ւ� - int mode = 0; // 0:.obj�O 1:.obj�� 2:.obj�� - bool change = false; // �ύX���� + // ファイルの書替え + int mode = 0; // 0:.obj前 1:.obj中 2:.obj後 + bool change = false; // 変更あり char line[1024]; char mkline[1024]; @@ -324,13 +341,13 @@ int main(int argc, char* argv[]) break; case 1: if (line[0] == '\n' || line[0] == '\0') { - // ���X�g�I��? + // リスト終了? fl_nm = getFile(); if (fl_nm != NULL) { - // �t�@�C���������� + // ファイルが増えた change = true; do { - //�o�� + //出力 fprintf(out, "%s", makeObjLine( mkline, _countof(mkline), fl_nm ) ); } while ((fl_nm = getFile()) != NULL); } @@ -339,12 +356,12 @@ int main(int argc, char* argv[]) else { fl_nm = getFile(); if (fl_nm == NULL) { - // �t�@�C���������� + // ファイルが減った change = true; continue; } makeObjLine( mkline, _countof(mkline), fl_nm ); - // �ύX�L�肩�H + // 変更有りか? if (!change && strcmp(line, mkline) != 0) change = true; wtline = mkline; @@ -353,7 +370,7 @@ int main(int argc, char* argv[]) case 2: break; } - //�o�� + //出力 fprintf(out,"%s", wtline); } @@ -361,25 +378,31 @@ int main(int argc, char* argv[]) fclose(in); fclose(out); #ifdef _DEBUG - printf("%d�‚̃I�u�W�F�N�g�t�@�C�������o�͂���܂���\n", file_list.size()); + // %d個のオブジェクトファイル名が出力されました + printf("Wrote %d object file names.\n", file_list.size()); #endif - // �t�@�C���̓����� + // ファイルの入換え if (change) { if (remove(makefile)) { - printf("Error: makefile[%s]���폜�o���܂���\n", tmp_file); + // Error: makefile[%s]を削除出来ません + printf("Error: Failed to remove Makefile[%s].\n", makefile); return 1; } if (rename( tmp_file, makefile )) { - printf("Error: �ꎞ�t�@�C��[%s]��makfile[%s]�ɏo���܂���\n", tmp_file, makefile); + // Error: 一時ファイル[%s]をmakfile[%s]に出来ません + printf("Error: Failed to rename Tmpfile[%s] to Makefile[%s].\n", tmp_file, makefile); return 1; } } else { if (remove(tmp_file)) { - printf("Warning: �ꎞ�t�@�C��[%s]���폜�o���܂���\n", tmp_file); + // Warning: 一時ファイル[%s]を削除出来ません + printf("Warning: Failed to remove Tmpfile[%s].\n", tmp_file); } - printf("�o�̓t�@�C���͍ŐV�ł�\n"); + + // 出力ファイルは最新です + printf("Makefile needs no change.\n"); } return 0;