Source code of Ensata (A Nintendo DS emulator made by Nintendo).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.c 8.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. // iris.rc( + resource.cpp)を楽に編集するためのプログラム
  2. // materials/text_resource.csv を参照して、ファイル内にIDがあればその訳をリソースにコピーします
  3. // 日本語の場合は、IDにUNREGが含まれている場合は、リソースの該当部分は変えず、代わりにunreg/resource.cppにコピーします
  4. // ※どちらも要整形。レイアウトがガタガタですので注意
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #define TRUE 1
  9. #define FALSE 0
  10. #define char_medium 256
  11. #define char_max 512
  12. //#define DEBUG
  13. int compare(const char id[80], FILE *fo, int lang, int unreg_flag, int label_u)
  14. {
  15. FILE *fcsv;
  16. char csv_ss[char_max], csv_id[80], csv_jp[char_medium], csv_eng[char_medium], string[char_max];
  17. int get_ch, ch, i = 0;
  18. int quotation_flag = 0;
  19. int comma_count = 0;
  20. int in_quot = 0;
  21. // CSVファイルを開く処理
  22. #ifdef DEBUG
  23. fcsv = fopen("..\\materials\\text_resource.csv", "r");
  24. #endif
  25. #ifndef DEBUG
  26. fcsv = fopen("text_resource.csv", "r");
  27. #endif
  28. if (fcsv == NULL){
  29. printf("CSVファイルを開けませんでした。\n何か入力して下さい");
  30. ch = getchar();
  31. exit(1);
  32. }
  33. // ","ごとに要素を分ける処理
  34. get_ch = fgetc(fcsv);
  35. while (get_ch != EOF){
  36. for (i = 0; i < char_medium; i++){
  37. csv_ss[i] = (char)get_ch;
  38. get_ch = fgetc(fcsv);
  39. if (!quotation_flag){
  40. if (csv_ss[i] == '\"'){
  41. csv_ss[i] = '\0';
  42. quotation_flag = !quotation_flag;
  43. break;
  44. }
  45. else if (csv_ss[i] == '\n'){
  46. csv_ss[i] = '\0';
  47. // 英語指定で、且つ行末に","が無いとき
  48. if (lang && comma_count == 2){
  49. strcpy(csv_eng, csv_ss);
  50. fprintf(fo, "\t%s\t\t\"%s\"\n", csv_id, csv_eng);
  51. fclose(fcsv);
  52. return TRUE;
  53. }
  54. comma_count = 0;
  55. break;
  56. }
  57. else if (csv_ss[i] == ','){
  58. csv_ss[i] = '\0';
  59. switch(comma_count){
  60. case 0:
  61. strcpy(csv_id, csv_ss);
  62. if (strcmp(csv_id, id) == 0){
  63. comma_count = 1;
  64. break;
  65. }
  66. else
  67. break;
  68. case 1:
  69. strcpy(csv_jp, csv_ss);
  70. comma_count = 2;
  71. if (!lang){
  72. if (!unreg_flag && label_u){
  73. return FALSE;
  74. }
  75. fprintf(fo, "\t%s\t\t\"%s\"\n", csv_id, csv_jp);
  76. fclose(fcsv);
  77. return TRUE;
  78. }
  79. break;
  80. case 2:
  81. strcpy(csv_eng, csv_ss);
  82. comma_count = 3;
  83. if (lang){
  84. fprintf(fo, "\t%s\t\t\"%s\"\n", csv_id, csv_eng);
  85. fclose(fcsv);
  86. return TRUE;
  87. }
  88. break;
  89. case 3:
  90. comma_count = 0;
  91. break;
  92. default:
  93. break;
  94. }
  95. break;
  96. }
  97. }
  98. // "~"の間は改行があっても1要素とみなす
  99. else if (quotation_flag)
  100. {
  101. if (csv_ss[i] == '\n'){
  102. csv_ss[i] = '\0';
  103. if (in_quot == TRUE)
  104. strcat(string, csv_ss);
  105. else
  106. strcpy(string, csv_ss);
  107. strcat(string, "\\r\\n");
  108. break;
  109. }
  110. else if (csv_ss[i] == '\"'){
  111. if (get_ch == '\"'){
  112. csv_ss[i] = '\0';
  113. if (in_quot == TRUE)
  114. strcat(string, csv_ss);
  115. else
  116. strcpy(string, csv_ss);
  117. strcat(string, "\"\"");
  118. get_ch = fgetc(fcsv);
  119. in_quot = TRUE;
  120. break;
  121. }
  122. else {
  123. csv_ss[i] = '\0';
  124. strcat(string, csv_ss);
  125. quotation_flag = 0;
  126. if (!lang){
  127. if (strcmp(csv_id, id) == 0 && comma_count == 1){
  128. if (in_quot == TRUE)
  129. in_quot = !in_quot;
  130. fprintf(fo, "\t%s\t\t\"%s\"\n", csv_id, string);
  131. fclose(fcsv);
  132. return TRUE;
  133. }
  134. }
  135. else if (lang){
  136. if (strcmp(csv_id, id) == 0 && comma_count == 2){
  137. if (in_quot == TRUE)
  138. in_quot = !in_quot;
  139. fprintf(fo, "\t%s\t\t\"%s\"\n", csv_id, string);
  140. fclose(fcsv);
  141. return TRUE;
  142. }
  143. }
  144. in_quot = FALSE;
  145. break;
  146. }
  147. }
  148. }
  149. }
  150. if (i > (char_medium - 1)){
  151. printf("CSVの要素の文字数が多すぎました。\n");
  152. getchar();
  153. exit(1);
  154. }
  155. }
  156. fclose(fcsv);
  157. return FALSE;
  158. }
  159. // 空白文字を判断
  160. int judge_white_space(int ch)
  161. {
  162. return (ch == '\n' || ch == ' ' || ch == '\t');
  163. }
  164. int main(int argc, char **argv)
  165. {
  166. FILE *frc, *fout;
  167. char rc_ss[char_max], rc_id[80], rc_string[char_max], id_label[20];
  168. char *p, *s_label, *e_label;
  169. int get_rc, s_number = 0, number = 0, i, j;
  170. int counter = FALSE;
  171. // 言語。英語は真、日本語は偽
  172. int language;
  173. // 日本語の場合は1回目のroop:と2回目のroop:で処理が変わるため、そのフラグ
  174. int unreg_flag = FALSE;
  175. int label_u;
  176. static int overflow_flag;
  177. static int compare_result, rm_result, rn_result;
  178. static int rc_quotation_flag = FALSE;
  179. // IDか訳かを判断するフラグ。FALSEならID、TRUEなら訳
  180. static int token_counter = FALSE;
  181. // IDのラベルのみを別に保持するためのフラグ
  182. static int label_flag = FALSE;
  183. // 対応するリソースファイルと結果出力ファイルを開く処理
  184. if (argc != 2){
  185. printf("number of arguments is not two.\n");
  186. exit(1);
  187. }
  188. p = argv[1];
  189. if (*p == 'j'){
  190. language = FALSE;
  191. frc = fopen("..\\WIN\\iris\\iris.rc", "r");
  192. }
  193. else if (*p == 'e'){
  194. language = TRUE;
  195. frc = fopen("..\\PluginSDK\\StrRes_eng\\StrRes_eng.rc", "r");
  196. }
  197. else {
  198. printf("command: 'j' or 'e'.\n");
  199. exit(1);
  200. }
  201. if (frc == NULL){
  202. printf("リソースファイルが開けませんでした。\n何か入力して下さい");
  203. getchar();
  204. exit(1);
  205. }
  206. if (!language){
  207. fout = fopen("iris.rc", "w");
  208. }
  209. else if (language){
  210. fout = fopen("StrRes_eng.rc", "w");
  211. }
  212. if (fout == NULL){
  213. printf("出力ファイルを開けませんでした。\n何か入力して下さい");
  214. getchar();
  215. exit(1);
  216. }
  217. // リソースファイルからIDを取得する処理
  218. roop:
  219. while (fgets(rc_ss, char_max, frc) != NULL){
  220. fputs(rc_ss, fout);
  221. if (strncmp(rc_ss, "STRINGTABLE", 10) == 0){
  222. fgets(rc_ss, char_max, frc); //STRINGTABLEの次の行にあるBEGINを読んで出力しておく
  223. fputs(rc_ss, fout);
  224. while (strcmp(rc_ss, "END") != 0){ //トークンごとに分ける
  225. label_u = FALSE; // UNREGラベルのチェックフラグ
  226. get_rc = fgetc(frc);
  227. if (!judge_white_space(get_rc)){
  228. overflow_flag = TRUE;
  229. for (i = 0; i < char_max; i++){
  230. rc_ss[i] = (char)get_rc;
  231. if (rc_ss[i] == '"')
  232. rc_quotation_flag = !rc_quotation_flag;
  233. else if (judge_white_space(rc_ss[i]) && !rc_quotation_flag)
  234. {
  235. rc_ss[i] = '\0';
  236. overflow_flag = FALSE;
  237. break;
  238. }
  239. get_rc = fgetc(frc);
  240. }
  241. // バッファオーバーフローを検知
  242. if (overflow_flag){
  243. printf("リソース文が長すぎました。\n何か入力して下さい");
  244. getchar();
  245. exit(1);
  246. }
  247. // 取得文字列の内容によって処理を変える
  248. if (strcmp(rc_ss, "END") == 0){
  249. fprintf(fout, "%s\n", rc_ss);
  250. break;
  251. }
  252. else if (!token_counter){
  253. strcpy(rc_id, rc_ss);
  254. s_label = strchr(rc_id, '_');
  255. s_label++;
  256. e_label = strchr(s_label, '_');
  257. if (e_label == NULL){
  258. number = strlen(s_label);
  259. }
  260. else
  261. number = (int)(e_label - s_label);
  262. for (j = 0; j < number; j++){
  263. id_label[j] = s_label[j];
  264. }
  265. id_label[number] = '\0';
  266. if (strcmp(id_label, "UNREG") == 0){
  267. // UNREGの時はiris.rcを更新したくないのでフラグ立て
  268. label_u = TRUE;
  269. }
  270. // IDが見つかったらCSVまたはresource.cppと比較
  271. if (unreg_flag){
  272. if (label_u && !language){
  273. compare_result = compare(rc_id, fout, language, unreg_flag, label_u);
  274. }
  275. }
  276. else {
  277. compare_result = compare(rc_id, fout, language, unreg_flag, label_u);
  278. }
  279. // 見つからなければ、リソースの内容を出力
  280. if (!compare_result)
  281. fprintf(fout, "\t%s\t", rc_id);
  282. }
  283. else if (token_counter){
  284. strcpy(rc_string, rc_ss);
  285. if (!compare_result)
  286. fprintf(fout, "\t%s\n", rc_string);
  287. }
  288. // フラグを戻しておく
  289. token_counter = !token_counter;
  290. }
  291. }
  292. }
  293. }
  294. fclose(frc);
  295. fclose(fout);
  296. // 1回目の処理を終えた後のファイル処理
  297. if (!unreg_flag){
  298. if (!language){
  299. rm_result = remove("..\\WIN\\iris\\iris.rc");
  300. rn_result = rename("iris.rc", "..\\WIN\\iris\\iris.rc");
  301. }
  302. else if (language){
  303. rm_result = remove("..\\PluginSDK\\StrRes_eng\\StrRes_eng.rc");
  304. rn_result = rename("StrRes_eng.rc", "..\\PluginSDK\\StrRes_eng\\StrRes_eng.rc");
  305. }
  306. if (rm_result != 0 || rn_result != 0){
  307. printf("出力ファイルの移動処理でエラーが起きました。\n何か入力して下さい");
  308. getchar();
  309. exit(1);
  310. }
  311. }
  312. // 日本語の場合のみ、unreg内のリソースにCSVの内容を反映するため2回目の処理へ
  313. if (!unreg_flag && !language){
  314. frc = fopen("..\\unreg\\resource.cpp", "r");
  315. if (frc == NULL){
  316. printf("unregのリソースを開けませんでした。\n");
  317. getchar();
  318. exit(1);
  319. }
  320. fout = fopen("resource.cpp", "w");
  321. if (fout == NULL){
  322. printf("unregの出力ファイルを開けませんでした。\n");
  323. getchar();
  324. exit(1);
  325. }
  326. unreg_flag = TRUE;
  327. goto roop;
  328. }
  329. if (!language){
  330. rm_result = remove("..\\unreg\\resource.cpp");
  331. rn_result = rename("resource.cpp", "..\\unreg\\resource.cpp");
  332. if (rm_result != 0 || rn_result != 0){
  333. printf("unreg出力ファイルの移動処理でエラーが起きました。\n何か入力して下さい");
  334. getchar();
  335. exit(1);
  336. }
  337. }
  338. return 0;
  339. }