1 /*
2  * romaji_main.c -
3  *
4  * Written By:  MURAOKA Taro <koron@tka.att.ne.jp>
5  * Last Change: 21-Sep-2004.
6  */
7 module romaji_main.romaji_main;
8 
9 
10 private static import core.stdc.stdio;
11 private static import core.stdc.string;
12 private static import migemo_d.romaji;
13 private static import std.getopt;
14 private static import std.string;
15 
16 enum DICTDIR = "../../dict";
17 enum DICT_ROMA2HIRA = DICTDIR ~ "/roma2hira.dat\0";
18 enum DICT_HIRA2KATA = DICTDIR ~ "/hira2kata.dat\0";
19 enum DICT_HAN2ZEN = DICTDIR ~ "/han2zen.dat\0";
20 enum DICT_ZEN2HAN = DICTDIR ~ "/zen2han.dat\0";
21 
22 nothrow @nogc
23 void query_one(migemo_d.romaji.romaji* object, migemo_d.romaji.romaji* hira2kata, migemo_d.romaji.romaji* han2zen, migemo_d.romaji.romaji* zen2han, char* buf)
24 
25 	do
26 	{
27 		/* ローマ字→平仮名(表示)→片仮名(表示) */
28 		char* stop;
29 		char* hira = migemo_d.romaji.romaji_convert(object, buf, &stop);
30 
31 		scope (exit) {
32 			if (hira != null) {
33 				migemo_d.romaji.romaji_release(object, hira);
34 				hira = null;
35 			}
36 		}
37 
38 		if (hira != null) {
39 			core.stdc.stdio.printf("  hira=%s, stop=%s\n", hira, stop);
40 
41 			version (all) {
42 				char* kata = migemo_d.romaji.romaji_convert2(hira2kata, hira, &stop, 0);
43 
44 				scope (exit) {
45 					if (kata != null) {
46 						migemo_d.romaji.romaji_release(hira2kata, kata);
47 						kata = null;
48 					}
49 				}
50 
51 				if (kata != null) {
52 					core.stdc.stdio.printf("  kata=%s, stop=%s\n", kata, stop);
53 					char* han = migemo_d.romaji.romaji_convert2(zen2han, kata, &stop, 0);
54 
55 					scope (exit) {
56 						if (han != null) {
57 							migemo_d.romaji.romaji_release(zen2han, han);
58 							han = null;
59 						}
60 					}
61 
62 					if (han != null) {
63 						core.stdc.stdio.printf("  han=%s, stop=%s\n", han, stop);
64 					}
65 				}
66 			}
67 		}
68 
69 		version (all) {
70 			char* zen = migemo_d.romaji.romaji_convert2(han2zen, buf, &stop, 0);
71 
72 			scope (exit) {
73 				if (zen != null) {
74 					migemo_d.romaji.romaji_release(han2zen, zen);
75 					zen = null;
76 				}
77 			}
78 
79 			if (zen != null) {
80 				core.stdc.stdio.printf("  zen=%s, stop=%s\n", zen, stop);
81 			}
82 		}
83 
84 		core.stdc.stdio.fflush(core.stdc.stdio.stdout);
85 	}
86 
87 nothrow @nogc
88 void query_loop(migemo_d.romaji.romaji* object, migemo_d.romaji.romaji* hira2kata, migemo_d.romaji.romaji* han2zen, migemo_d.romaji.romaji* zen2han)
89 
90 	do
91 	{
92 		char[256] buf;
93 
94 		while (true) {
95 			core.stdc.stdio.printf("QUERY: ");
96 
97 			if (!core.stdc.stdio.fgets(&(buf[0]), buf.length, core.stdc.stdio.stdin)) {
98 				core.stdc.stdio.printf("\n");
99 
100 				break;
101 			}
102 
103 			/* 改行をNUL文字に置き換える */
104 			char* ans = core.stdc..string.strchr(&(buf[0]), '\n');
105 
106 			if (ans != null) {
107 				*ans = '\0';
108 			}
109 
110 			.query_one(object, hira2kata, han2zen, zen2han, &(buf[0]));
111 		}
112 	}
113 
114 int main(string[] argv)
115 
116 	do
117 	{
118 		migemo_d.romaji.romaji* object = migemo_d.romaji.romaji_open();
119 		migemo_d.romaji.romaji* hira2kata = migemo_d.romaji.romaji_open();
120 		migemo_d.romaji.romaji* han2zen = migemo_d.romaji.romaji_open();
121 		migemo_d.romaji.romaji* zen2han = migemo_d.romaji.romaji_open();
122 
123 		scope (exit) {
124 			if (zen2han != null) {
125 				migemo_d.romaji.romaji_close(zen2han);
126 				zen2han = null;
127 			}
128 
129 			if (han2zen != null) {
130 				migemo_d.romaji.romaji_close(han2zen);
131 				han2zen = null;
132 			}
133 
134 			if (hira2kata != null) {
135 				migemo_d.romaji.romaji_close(hira2kata);
136 				hira2kata = null;
137 			}
138 
139 			if (object != null) {
140 				migemo_d.romaji.romaji_close(object);
141 				object = null;
142 			}
143 		}
144 
145 		migemo_d.romaji.romaji_set_verbose(zen2han, 1);
146 
147 		string word = null;
148 
149 		auto help_info = std.getopt.getopt
150 		(
151 			argv,
152 			"word|w", &word
153 		);
154 
155 		if ((object != null) && (hira2kata != null) && (han2zen != null) && (zen2han != null)) {
156 			int retval = migemo_d.romaji.romaji_load(object, .DICT_ROMA2HIRA.ptr);
157 			core.stdc.stdio.printf("romaji_load(%s)=%d\n", .DICT_ROMA2HIRA.ptr, retval);
158 			retval = migemo_d.romaji.romaji_load(hira2kata, .DICT_HIRA2KATA.ptr);
159 			core.stdc.stdio.printf("romaji_load(%s)=%d\n", .DICT_HIRA2KATA.ptr, retval);
160 			retval = migemo_d.romaji.romaji_load(han2zen, .DICT_HAN2ZEN.ptr);
161 			core.stdc.stdio.printf("romaji_load(%s)=%d\n", .DICT_HAN2ZEN.ptr, retval);
162 			retval = migemo_d.romaji.romaji_load(zen2han, .DICT_ZEN2HAN.ptr);
163 			core.stdc.stdio.printf("romaji_load(%s)=%d\n", .DICT_HAN2ZEN.ptr, retval);
164 
165 			if (word != null) {
166 				.query_one(object, hira2kata, han2zen, zen2han, std..string.toStringz(word));
167 			} else {
168 				.query_loop(object, hira2kata, han2zen, zen2han);
169 			}
170 		}
171 
172 		return 0;
173 	}