Advertisement
yy981

for ChatGPT

Nov 27th, 2024
11
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <filesystem>
  5. #include <cstdlib>
  6. #include <vector>
  7. #include <windows.h>
  8. #include <tlhelp32.h>
  9. #include <zlib.h>
  10. #include <cstdint>
  11. #include <thread>
  12. #include <yy981/dll.h>
  13.  
  14.  
  15. namespace fs = std::filesystem;
  16. std::string option, exename, sourceFile, mocFilePath, include_qt6, addlibrary, original, iconPath, icon, dllCompileCMD;
  17. std::string temp(std::string(std::getenv("temp")));
  18. std::string mkpath = temp + "/_.mk";
  19. bool enableOriginal_qt(false), enableIcon(false), isCompiling(false), compilerCPPMode(true), dllMode(false);
  20. int cmd(const std::string& command) {return std::system(command.c_str());}
  21. constexpr std::string compilerM() {if (compilerCPPMode) return "g++"; else return "gcc";}
  22. int taskLevel = 3;
  23. uint32_t hash;
  24.  
  25.  
  26. inline void flags() {
  27. if (enableIcon) {
  28. std::ofstream(temp+".rc") << "IDI_ICON1 ICON \"" << original << "\"";
  29. cmd("windres.exe -i " + temp+"/icon.rc" + " -o " + temp+"/icon.o");
  30. icon = temp+"/icon.o";
  31. }
  32. }
  33.  
  34. // ファイルハッシュ計算
  35. uint32_t calculateCRC32(const std::string &filePath) {
  36. std::ifstream file(filePath, std::ios::binary);
  37. if (!file.is_open()) {
  38. std::cerr << "Failed to open file!" << std::endl;
  39. return 0;
  40. }
  41.  
  42. uint32_t crc = crc32(0L, Z_NULL, 0); // 初期化
  43. char buffer[4096];
  44.  
  45. while (file.read(buffer, sizeof(buffer)) || file.gcount() > 0) {
  46. crc = crc32(crc, reinterpret_cast<const Bytef *>(buffer), file.gcount());
  47. }
  48.  
  49. return crc;
  50. }
  51.  
  52. // プロセス名からプロセスIDを取得
  53. DWORD GetProcessIDByName(const std::string& processName) {
  54. PROCESSENTRY32 entry;
  55. entry.dwSize = sizeof(PROCESSENTRY32);
  56.  
  57. HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  58. if (Process32First(snapshot, &entry)) {
  59. do {
  60. if (processName == entry.szExeFile) {
  61. CloseHandle(snapshot);
  62. return entry.th32ProcessID;
  63. }
  64. } while (Process32Next(snapshot, &entry));
  65. }
  66.  
  67. CloseHandle(snapshot);
  68. return 0;
  69. }
  70.  
  71. // プロセス優先度を変更
  72. bool SetProcessPriority(const std::string& processName, DWORD priorityClass) {
  73. DWORD processID = GetProcessIDByName(processName);
  74. if (processID == 0) {
  75. std::cout << "プロセスが見つかりません" << std::endl;
  76. return false;
  77. }
  78.  
  79. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
  80. if (hProcess == NULL) {
  81. std::cout << "プロセスを開けません" << std::endl;
  82. return false;
  83. }
  84.  
  85. if (!SetPriorityClass(hProcess, priorityClass)) {
  86. std::cout << "優先度を変更できません" << std::endl;
  87. CloseHandle(hProcess);
  88. return false;
  89. }
  90.  
  91. std::cout << "優先度を正常に変更しました" << std::endl;
  92. CloseHandle(hProcess);
  93. return true;
  94. }
  95.  
  96. constexpr void task() {
  97. DWORD priorityClass;
  98. switch (taskLevel) {
  99. case 1: priorityClass = HIGH_PRIORITY_CLASS; break;
  100. case 2: priorityClass = ABOVE_NORMAL_PRIORITY_CLASS; break;
  101. case 3: return;
  102. case 4: priorityClass = BELOW_NORMAL_PRIORITY_CLASS; break;
  103. case 5: priorityClass = IDLE_PRIORITY_CLASS; break;
  104. }
  105.  
  106. // プロセスの優先度を変更
  107. std::thread([priorityClass]{
  108. bool continueLoop = true;
  109. while (continueLoop&&isCompiling) if (SetProcessPriority("cc1plus.exe", priorityClass)) {continueLoop = false;std::cout << "y\n";}
  110. }).detach();
  111. }
  112.  
  113. std::vector<std::string> findString(std::string& input, std::string start, std::string end) {
  114. std::vector<std::string> output;
  115. int startpos = 0;
  116. while(true) {
  117. // start 検索
  118. size_t f = input.find(start,startpos);
  119. if (f == std::string::npos) break;
  120.  
  121. // end 検索
  122. size_t b = input.find(end, f);
  123. if (b == std::string::npos) break;
  124.  
  125. // 部分文字列を抽出
  126. output.emplace_back(input.substr(f, b-f+1));
  127. startpos = b+1;
  128. }
  129. return output;
  130. }
  131.  
  132. void userInput() {
  133. std::cout << "独自オプション: ";
  134. std::getline(std::cin,original);
  135. std::cout << "実行ファイル名(拡張子除く): ";
  136. std::getline(std::cin,exename);
  137. std::cout << "追加ライブラリ(各ファイル名の前に-lを追加): ";
  138. std::getline(std::cin,addlibrary);
  139. std::cout << "オプション: ";
  140. std::getline(std::cin,option);
  141. }
  142.  
  143. void readYBP(char* argv[]) {
  144. std::string line;
  145. std::ifstream file(argv[1]);
  146. int loop = 0;
  147.  
  148. // ファイルから1行ずつ読み込む
  149. while (std::getline(file, line)) {
  150. loop++;
  151.  
  152. // std::cout << "読み込んだ行[" << loop << "]: " << line << '\n';
  153.  
  154. switch (loop) {
  155. case 1: if (line=="null") {std::cerr << "必須要素のSourceFileがnullです";exit(3);} else sourceFile = line; break;
  156. case 2: if (line=="null") exename = sourceFile; else exename = line; break;
  157. case 3: if (line=="null") addlibrary = ""; else addlibrary = line; break;
  158. case 4: if (line=="null") option = ""; else option = line; break;
  159. case 5: if (line=="null") original = ""; else original = line; break;
  160. default:
  161. std::cout << "ybp読み取りエラー: 必要な行数以上の行が存在しますが無視します\n";
  162. return; // 5行読み込んだら終了
  163. }
  164. }
  165.  
  166. if (loop < 5) {
  167. std::cerr << "ybp読み取りエラー: 行数不足 " << loop << "行しかありません\n";
  168. exit(3);
  169. }
  170. }
  171.  
  172. void createYBP() {
  173. std::cout << "[ybp生成モード]\nソースコードファイル名(拡張子除く): ";
  174. std::getline(std::cin,sourceFile);
  175. userInput();
  176. std::ofstream(sourceFile + ".ybp2") << (sourceFile.empty()? "null" : sourceFile) << "\n"
  177. << (exename.empty()? "null" : exename) << "\n"
  178. << (addlibrary.empty()? "null" : addlibrary) << "\n"
  179. << (option.empty()? "null" : option) << "\n"
  180. << (original.empty()? "null" : original);
  181. }
  182.  
  183. void writeMK() {
  184. std::string stdcpp23, cp932, icon;
  185. if (exename.empty()) exename=sourceFile;
  186. // 入力処理
  187. if (!original.contains("nocp932")) cp932 = "-fexec-charset=cp932";
  188. if (original.contains("qt")) {
  189. addlibrary = addlibrary + " -lQt6Core -lQt6Widgets -lQt6Gui";
  190. include_qt6 = "-Ic:/msys64/mingw64/include/qt6";
  191. enableOriginal_qt = true;
  192. }
  193. if (!original.contains("nocpp23")) stdcpp23 = "-std=c++23";
  194. if (original.contains("icon")) {
  195. if (original.substr(4,1) != "=") std::cerr << "使い方が違います icon=<ファイルパス>";
  196. original.erase(0,original.find("icon")+5);
  197. iconPath = original;
  198. }
  199. if (original.contains("gcc")) compilerCPPMode = false;
  200. if (original.contains("dll")) {
  201. dllCompileCMD =
  202. compilerM() + " -shared -o " + exename + ".dll " + sourceFile + ".cpp " + (enableOriginal_qt? mocFilePath : "") +
  203. cp932 + " " + stdcpp23 + " " + option + " -Ic:/msys64/mingw64/include " + include_qt6 + " -Lc:/msys64/mingw64/lib " + addlibrary;
  204. bool dllMode = true;
  205. return;
  206. }
  207.  
  208. std::ofstream(mkpath)
  209. << "CC = " << compilerM()
  210. << "\nCFLAGS = " << cp932 << " " << stdcpp23 << " " << option
  211. << "\nTARGET = " << exename << ".exe"
  212. << "\nSRCS = " << sourceFile << ".cpp " << (enableOriginal_qt? mocFilePath : "") << (enableIcon? icon : "")
  213. << "\nOBJS = " << sourceFile << ".o"
  214. << "\nINCDIR = -Ic:/msys64/mingw64/include " << include_qt6
  215. << "\nLIBDIR = -Lc:/msys64/mingw64/lib"
  216. << "\nLIBS = " << addlibrary
  217. << "\n$(TARGET): $(OBJS)"
  218. << "\n\t$(CC) -o $@ $^ $(LIBDIR) $(LIBS)"
  219. << "\n%.o: %.cpp"
  220. << "\n\t$(CC) $(CFLAGS) $(INCDIR) -c $< -o $@";
  221. hash = calculateCRC32(mkpath);
  222. }
  223.  
  224. inline void core() {
  225. task();
  226. flags();
  227. if (calculateCRC32(mkpath) != hash) writeMK();
  228. int returnCode = cmd((dllMode? dllCompileCMD : "c:/GnuWin32/bin/make.exe -B -f " + mkpath)); // 核
  229. if (returnCode==0) std::cout << "成功\n"; else std::cout << "エラー[" << returnCode << "]\n\n";
  230. }
  231.  
  232. inline void compile() {
  233. core();
  234. std::string input;
  235. while(true) {
  236. std::cout << "> ";
  237. std::getline(std::cin,input); //指示
  238. if (input == "help")
  239. std::cout << "moc: .mocファイルを生成\n"
  240. << "write: .mkファイルを生成\n"
  241. << "exit: 終了\n"
  242. << "set: 変数を変更(詳細はcustomと入力してください)\n"
  243. << " 例: set sou test";
  244. else if (input == "moc") cmd("c:/msys64/mingw64/share/qt6/bin/moc.exe " + mocFilePath);
  245. else if (input == "write") writeMK();
  246. else if (input.starts_with("icon")) {
  247. if (input.size()==4) std::cout << "Icon: 現在" << (enableIcon? "有効" : "無効") << "です フラグの変更を行いたい場合は、後ろにONやOFFをつけたコマンドを使用してください";
  248. else {
  249. input.erase(0,5);
  250. if (input=="ON"||input=="on") enableIcon = true;
  251. else if (input=="OFF"||input=="off") enableIcon = false;
  252. else std::cerr << "第二層入力エラー";
  253. }
  254. }
  255. else if (input.size() >= 4 && input.starts_with("task")) {
  256. if (input == "task") input += " help";
  257. if (input == "task ") input += "help";
  258. input.erase(0,5);
  259. if (input.substr(0,4)=="help") std::cout << "例: task [1:高 2:通常以上 3:通常 4:通常以下 5:低]\n現在: " << taskLevel;
  260. else taskLevel = std::stoi(input.substr(0,1));
  261. }
  262. else if (input.size() >= 3 && input.starts_with("set")) { // set.begin
  263. if (input == "set") input += " help";
  264. if (input == "set ") input += "help";
  265. input.erase(0,4);
  266. char windowTitle[256];
  267. GetConsoleTitle(windowTitle,256);
  268. if (input.substr(0,4)=="help") {
  269. std::cout << " sou: ソースファイル名 (現在: " << sourceFile << " )\n"
  270. << " exe: 実行ファイル名 (現在: " << exename << " )\n"
  271. << " lib: 追加ライブラリ (現在: " << addlibrary << " )\n"
  272. << " opt: オプション (現在: " << option << " )\n"
  273. << " ori: 独自オプション (現在: " << original << " )\n"
  274. << " tit: ウィンドウタイトル (現在: " << windowTitle << " )\n"
  275. << " 例: set sou test";
  276. } else if (input.substr(3,1)==" ") {
  277. if (input.substr(0,3)=="sou") sourceFile = input.substr(4);
  278. else if (input.substr(0,3)=="exe") exename = input.substr(4);
  279. else if (input.substr(0,3)=="opt") sourceFile = input.substr(4);
  280. else if (input.substr(0,3)=="lib") addlibrary = input.substr(4);
  281. else if (input.substr(0,3)=="ori") original = input.substr(4);
  282. else if (input.substr(0,3)=="tit") SetConsoleTitle(input.substr(4).c_str());
  283. else std::cerr << "第三層入力エラー";
  284. writeMK();
  285. } else std::cerr << "第二層入力エラー";
  286. } // set.end
  287. else if (input == "exit") break;
  288. else if (input == "") core();
  289. else std::cerr << "有効なコマンドではありません help と打ってコマンドを確認してください";
  290. std::cout << "\n";
  291. }
  292. }
  293.  
  294. inline void end(){if (fs::exists(sourceFile+".o")) fs::remove(sourceFile+".o");}
  295.  
  296.  
  297. int main(int argc, char *argv[]) {
  298. sourceFile = exename = addlibrary = option = original = "null";
  299. if (argc == 1) {
  300. SetConsoleTitle("Compiler-YBP");
  301. createYBP();
  302. return 0;
  303. }
  304. // set paths
  305. sourceFile = fs::path(argv[1]).stem().string();
  306. mocFilePath = sourceFile + ".cpp -o " + temp + "/" + sourceFile + ".moc";
  307. SetConsoleTitle(std::string("[" + sourceFile + "] MSYS2-Mingw64_New-Compiler").c_str());
  308.  
  309. bool inputMK = false;
  310. if (argc > 2) {std::cerr << "コマンドライン引数エラー\n";return 1;}
  311. std::string inputExtention = fs::path(argv[1]).extension().string();
  312. if (inputExtention == ".ybp") {
  313. char input;
  314. std::cout << ".ybpファイルはMSYS2-Mingw64_Compiler(M2-M64_Compiler.bat)を使用してください\n.ybpファイルを.ybp2ファイルに変換しますか? [Y,N] ";
  315. std::cin >> input;
  316. if (input=='Y'||input=='y') case 'Y': case 'y': upgradeYBP(sourceFile);
  317. }
  318. if (inputExtention == ".cpp" || inputExtention == ".c" || inputExtention == ".ybp2" || inputExtention == ".mk") {
  319. if (inputExtention == ".ybp2") readYBP(argv);
  320. else if (inputExtention == ".mk") inputMK=true;
  321. else {
  322. if (inputExtention == ".c") compilerCPPMode = false;
  323. userInput();
  324. }
  325. } else {
  326. std::cout << "[警告] C(.c) もしくは C++(.cpp) もしくは BuildProfile2(.ybp2) もしくは MakeFile(.mk) ではありませんが、続行しますか?\n"
  327. << "[Y:ソースファイルとして続行 N:終了 B:BuildProfileとして続行 M:MakeFileとして続行]: ";
  328. char input;
  329. std::cin.get() >> input;
  330. switch(input) {
  331. case 'Y': case 'y': userInput(); break;
  332. case 'N': case 'n': return 0;
  333. case 'B': case 'b': readYBP(argv); break;
  334. case 'M': case 'm': inputMK=true; break;
  335. default: return 2;
  336. }
  337. }
  338.  
  339. if (!inputMK) writeMK();
  340.  
  341. compile();
  342.  
  343. // 終了
  344. end();
  345. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement