7 MPlist *error_invalid_format;
8 MPlist *error_unknown_command;
9 MPlist *error_invalid_arg;
10 MPlist *error_command_fail;
11 MPlist *error_lock_fail;
13 MSymbol Merror, Mvalue;
14 MSymbol Meval_function;
18 m17n_object_ref (msg); \
22 MPlist *eval (MPlist *);
24 #define INTEGERP(plist) (mplist_key (plist) == Minteger)
25 #define SYMBOLP(plist) (mplist_key (plist) == Msymbol)
26 #define MTEXTP(plist) (mplist_key (plist) == Mtext)
27 #define PLISTP(plist) (mplist_key (plist) == Mplist)
28 #define TAILP(plist) (mplist_key (plist) == Mnil)
31 eval_set (MPlist *arg)
36 ERROR (error_invalid_arg);
37 var = mplist_value (arg);
38 arg = mplist_next (arg);
40 msymbol_put (var, Mvalue, NULL);
41 else if (PLISTP (arg))
42 msymbol_put (var, Mvalue, eval (mplist_value (arg)));
45 m17n_object_ref (arg);
46 msymbol_put (var, Mvalue, arg);
52 eval_open (MPlist *arg)
58 ERROR (error_invalid_arg);
59 lang = mplist_value (arg);
60 arg = mplist_next (arg);
62 ERROR (error_invalid_arg);
63 name = mplist_value (arg);
64 im = minput_open_im (lang, name, Mnil);
66 mplist_add (arg, Mt, im);
71 eval_close (MPlist *arg)
76 ERROR (error_invalid_arg);
77 value = msymbol_get (mplist_value (arg), Mvalue);
79 ERROR (error_invalid_arg);
80 minput_close_im (mplist_value (value));
85 eval_get_command (MPlist *arg)
87 MSymbol lang, name, command;
90 ERROR (error_invalid_arg);
91 lang = mplist_value (arg);
92 arg = mplist_next (arg);
94 ERROR (error_invalid_arg);
95 name = mplist_value (arg);
96 arg = mplist_next (arg);
98 command = mplist_value (arg);
102 ERROR (error_invalid_arg);
103 arg = minput_get_command (lang, name, command);
105 m17n_object_ref (arg);
110 eval_config_command (MPlist *arg)
112 MSymbol lang, name, command;
116 ERROR (error_invalid_arg);
117 lang = mplist_value (arg);
118 arg = mplist_next (arg);
120 ERROR (error_invalid_arg);
121 name = mplist_value (arg);
122 arg = mplist_next (arg);
125 command = mplist_value (arg);
126 arg = mplist_next (arg);
128 else if (TAILP (arg))
131 ERROR (error_invalid_arg);
136 if (minput_config_command (lang, name, command, keyseq) < 0)
137 ERROR (error_command_fail);
142 eval_get_variable (MPlist *arg)
144 MSymbol lang, name, variable;
147 ERROR (error_invalid_arg);
148 lang = mplist_value (arg);
149 arg = mplist_next (arg);
151 ERROR (error_invalid_arg);
152 name = mplist_value (arg);
153 arg = mplist_next (arg);
155 variable = mplist_value (arg);
156 else if (TAILP (arg))
159 ERROR (error_invalid_arg);
160 arg = minput_get_variable (lang, name, variable);
162 m17n_object_ref (arg);
167 eval_config_variable (MPlist *arg)
169 MSymbol lang, name, variable;
172 ERROR (error_invalid_arg);
173 lang = mplist_value (arg);
174 arg = mplist_next (arg);
176 ERROR (error_invalid_arg);
177 name = mplist_value (arg);
178 arg = mplist_next (arg);
181 variable = mplist_value (arg);
182 arg = mplist_next (arg);
184 else if (TAILP (arg))
187 ERROR (error_invalid_arg);
190 if (minput_config_variable (lang, name, variable, arg) < 0)
191 ERROR (error_command_fail);
196 eval_save_config (MPlist *arg)
198 int ret = minput_save_config ();
201 ERROR (error_command_fail);
203 ERROR (error_lock_fail);
208 MPlist *(*eval_func) (MPlist *arg);
210 { {eval_set}, {eval_open}, {eval_close}, {eval_get_command},
211 {eval_config_command}, {eval_get_variable}, {eval_config_variable},
212 {eval_save_config} };
218 struct EvalFunc *eval_func;
220 if (! SYMBOLP (plist))
221 ERROR (error_invalid_format);
222 cmd = mplist_value (plist);
223 eval_func = msymbol_get (cmd, Meval_function);
226 if (mplist_key (mplist_next (plist)) == Mnil)
228 MPlist *value = msymbol_get (cmd, Mvalue);
233 ERROR (error_unknown_command);
236 return eval_func->eval_func (mplist_next (plist));
242 Merror = msymbol ("error");
243 Mvalue = msymbol ("value");
245 Meval_function = msymbol ("eval-function");
246 msymbol_put (msymbol ("set"), Meval_function, eval_functions + 0);
247 msymbol_put (msymbol ("open"), Meval_function, eval_functions + 1);
248 msymbol_put (msymbol ("close"), Meval_function, eval_functions + 2);
249 msymbol_put (msymbol ("get-command"), Meval_function, eval_functions + 3);
250 msymbol_put (msymbol ("config-command"), Meval_function, eval_functions + 4);
251 msymbol_put (msymbol ("get-variable"), Meval_function, eval_functions + 5);
252 msymbol_put (msymbol ("config-variable"), Meval_function, eval_functions + 6);
253 msymbol_put (msymbol ("save-config"), Meval_function, eval_functions + 7);
255 error_invalid_format = mplist ();
256 mplist_add (error_invalid_format, Msymbol, Merror);
257 mplist_add (error_invalid_format, Msymbol, msymbol ("invalid-format"));
259 error_unknown_command = mplist ();
260 mplist_add (error_unknown_command, Msymbol, Merror);
261 mplist_add (error_unknown_command, Msymbol, msymbol ("unknwon-command"));
263 error_invalid_arg = mplist ();
264 mplist_add (error_invalid_arg, Msymbol, Merror);
265 mplist_add (error_invalid_arg, Msymbol, msymbol ("invalid-argument"));
267 error_command_fail = mplist ();
268 mplist_add (error_command_fail, Msymbol, Merror);
269 mplist_add (error_command_fail, Msymbol, msymbol ("command-fail"));
271 error_lock_fail = mplist ();
272 mplist_add (error_lock_fail, Msymbol, Merror);
273 mplist_add (error_lock_fail, Msymbol, msymbol ("lock-fail"));
279 m17n_object_unref (error_invalid_format);
280 m17n_object_unref (error_unknown_command);
281 m17n_object_unref (error_invalid_arg);
282 m17n_object_unref (error_command_fail);
293 while (printf ("> ") && fgets (line, 256, stdin) != NULL)
298 if (line[strlen (line) - 1] == '\n')
299 line[strlen (line) - 1] = '\0';
300 mt = mtext_from_data (line, strlen (line), MTEXT_FORMAT_US_ASCII);
301 plist = mplist_deserialize (mt);
306 mdebug_dump_plist (val, 0);
309 m17n_object_unref (val);
311 m17n_object_unref (plist);
312 m17n_object_unref (mt);