8 MPlist *error_invalid_format;
9 MPlist *error_unknown_command;
10 MPlist *error_invalid_arg;
11 MPlist *error_command_fail;
12 MPlist *error_lock_fail;
14 MSymbol Merror, Mvalue;
15 MSymbol Meval_function;
19 m17n_object_ref (msg); \
23 MPlist *eval (MPlist *);
25 #define INTEGERP(plist) (mplist_key (plist) == Minteger)
26 #define SYMBOLP(plist) (mplist_key (plist) == Msymbol)
27 #define MTEXTP(plist) (mplist_key (plist) == Mtext)
28 #define PLISTP(plist) (mplist_key (plist) == Mplist)
29 #define TAILP(plist) (mplist_key (plist) == Mnil)
31 MPlist *eval_help (MPlist *arg);
34 eval_set (MPlist *arg)
39 ERROR (error_invalid_arg);
40 var = mplist_value (arg);
41 arg = mplist_next (arg);
43 msymbol_put (var, Mvalue, NULL);
44 else if (PLISTP (arg))
45 msymbol_put (var, Mvalue, eval (mplist_value (arg)));
48 m17n_object_ref (arg);
49 msymbol_put (var, Mvalue, arg);
55 eval_open (MPlist *arg)
61 ERROR (error_invalid_arg);
62 lang = mplist_value (arg);
63 arg = mplist_next (arg);
65 ERROR (error_invalid_arg);
66 name = mplist_value (arg);
67 im = minput_open_im (lang, name, Mnil);
69 mplist_add (arg, Mt, im);
74 eval_close (MPlist *arg)
79 ERROR (error_invalid_arg);
80 value = msymbol_get (mplist_value (arg), Mvalue);
82 ERROR (error_invalid_arg);
83 minput_close_im (mplist_value (value));
88 eval_get_description (MPlist *arg)
95 ERROR (error_invalid_arg);
96 lang = mplist_value (arg);
97 arg = mplist_next (arg);
99 ERROR (error_invalid_arg);
100 name = mplist_value (arg);
101 mt = minput_get_description (lang, name);
103 ERROR (error_command_fail);
105 mplist_add (plist, Mtext, mt);
106 m17n_object_unref (mt);
112 parse_arg_common (MPlist *arg, MSymbol *lang, MSymbol *name, MSymbol *target)
115 *lang = Mt, *name = Mnil, *target = Mnil;
120 *lang = mplist_value (arg);
121 arg = mplist_next (arg);
124 *name = mplist_value (arg);
125 arg = mplist_next (arg);
128 *target = mplist_value (arg);
129 arg = mplist_next (arg);
131 else if (TAILP (arg))
140 call_get_common (MPlist *(*func) (MSymbol, MSymbol, MSymbol), MPlist *arg)
142 MSymbol lang, name, target;
144 arg = parse_arg_common (arg, &lang, &name, &target);
146 ERROR (error_invalid_arg);
149 arg = func (lang, name, target);
151 ERROR (error_command_fail);
152 /* Prevent it be freed. */
153 m17n_object_ref (arg);
158 eval_get_command (MPlist *arg)
160 return call_get_common (minput_get_command, arg);
164 eval_get_variable (MPlist *arg)
166 return call_get_common (minput_get_variable, arg);
170 call_config_common (int (*func) (MSymbol, MSymbol, MSymbol, MPlist *),
173 MSymbol lang, name, target;
175 arg = parse_arg_common (arg, &lang, &name, &target);
177 ERROR (error_invalid_arg);
180 if (func (lang, name, target, arg) < 0)
181 ERROR (error_command_fail);
186 eval_config_command (MPlist *arg)
188 return call_config_common (minput_config_command, arg);
192 eval_config_variable (MPlist *arg)
194 return call_config_common (minput_config_variable, arg);
198 eval_save_config (MPlist *arg)
200 int ret = minput_save_config ();
203 ERROR (error_command_fail);
205 ERROR (error_lock_fail);
210 MPlist *(*eval_func) (MPlist *arg);
213 { {eval_help, "help"},
214 {eval_set, "set SYMBOL FORM"},
215 {eval_open, "open LANG NAME"},
216 {eval_close, "close SYMBOL"},
217 {eval_get_description, "get-description LANG NAME"},
218 {eval_get_command, "get-command [LANG NAME [COMMAND]]"},
219 {eval_config_command, "config-command LANG NAME [COMMAND [(KEY ...) ...]]"},
220 {eval_get_variable, "get-variable [LANG NAME [VARIABLE]]"},
221 {eval_config_variable, "config-variable LANG NAME [VARIABLE [VALUE]]"},
222 {eval_save_config, "save-config"} };
225 eval_help (MPlist *arg)
229 printf ("Valid FORMs are:\n");
230 for (i = 0; i < (sizeof eval_functions) / (sizeof eval_functions[0]); i++)
231 printf (" %s\n", eval_functions[i].form);
232 printf (" SYMBOL -- print the value of SYMBOL\n");
240 struct EvalFunc *eval_func;
242 if (! SYMBOLP (plist))
243 ERROR (error_invalid_format);
244 cmd = mplist_value (plist);
245 eval_func = msymbol_get (cmd, Meval_function);
248 if (mplist_key (mplist_next (plist)) == Mnil)
250 MPlist *value = msymbol_get (cmd, Mvalue);
255 ERROR (error_unknown_command);
258 return eval_func->eval_func (mplist_next (plist));
268 Merror = msymbol ("error");
269 Mvalue = msymbol ("value");
271 Meval_function = msymbol ("eval-function");
273 msymbol_put (msymbol ("help"), Meval_function, eval_functions + n), n++;
274 msymbol_put (msymbol ("set"), Meval_function, eval_functions + n), n++;
275 msymbol_put (msymbol ("open"), Meval_function, eval_functions + n), n++;
276 msymbol_put (msymbol ("close"), Meval_function, eval_functions + n), n++;
277 msymbol_put (msymbol ("get-description"), Meval_function, eval_functions + n), n++;
278 msymbol_put (msymbol ("get-command"), Meval_function, eval_functions + n), n++;
279 msymbol_put (msymbol ("config-command"), Meval_function, eval_functions + n), n++;
280 msymbol_put (msymbol ("get-variable"), Meval_function, eval_functions + n), n++;
281 msymbol_put (msymbol ("config-variable"), Meval_function, eval_functions + n), n++;
282 msymbol_put (msymbol ("save-config"), Meval_function, eval_functions + n);
284 error_invalid_format = mplist ();
285 mplist_add (error_invalid_format, Msymbol, Merror);
286 mplist_add (error_invalid_format, Msymbol, msymbol ("invalid-format"));
288 error_unknown_command = mplist ();
289 mplist_add (error_unknown_command, Msymbol, Merror);
290 mplist_add (error_unknown_command, Msymbol, msymbol ("unknwon-command"));
292 error_invalid_arg = mplist ();
293 mplist_add (error_invalid_arg, Msymbol, Merror);
294 mplist_add (error_invalid_arg, Msymbol, msymbol ("invalid-argument"));
296 error_command_fail = mplist ();
297 mplist_add (error_command_fail, Msymbol, Merror);
298 mplist_add (error_command_fail, Msymbol, msymbol ("command-fail"));
300 error_lock_fail = mplist ();
301 mplist_add (error_lock_fail, Msymbol, Merror);
302 mplist_add (error_lock_fail, Msymbol, msymbol ("lock-fail"));
308 m17n_object_unref (error_invalid_format);
309 m17n_object_unref (error_unknown_command);
310 m17n_object_unref (error_invalid_arg);
311 m17n_object_unref (error_command_fail);
312 m17n_object_unref (error_lock_fail);
322 setlocale (LC_ALL, "");
326 while (printf ("> ") && fgets (line, 256, stdin) != NULL)
330 int len = strlen (line);
332 if (line[len - 1] == '\n')
337 mt = mtext_from_data (line, len, MTEXT_FORMAT_US_ASCII);
338 plist = mplist_deserialize (mt);
343 mdebug_dump_plist (val, 0);
346 m17n_object_unref (val);
348 m17n_object_unref (plist);
349 m17n_object_unref (mt);