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)
30 MPlist *eval_help (MPlist *arg);
33 eval_set (MPlist *arg)
38 ERROR (error_invalid_arg);
39 var = mplist_value (arg);
40 arg = mplist_next (arg);
42 msymbol_put (var, Mvalue, NULL);
43 else if (PLISTP (arg))
44 msymbol_put (var, Mvalue, eval (mplist_value (arg)));
47 m17n_object_ref (arg);
48 msymbol_put (var, Mvalue, arg);
54 eval_open (MPlist *arg)
60 ERROR (error_invalid_arg);
61 lang = mplist_value (arg);
62 arg = mplist_next (arg);
64 ERROR (error_invalid_arg);
65 name = mplist_value (arg);
66 im = minput_open_im (lang, name, Mnil);
68 mplist_add (arg, Mt, im);
73 eval_close (MPlist *arg)
78 ERROR (error_invalid_arg);
79 value = msymbol_get (mplist_value (arg), Mvalue);
81 ERROR (error_invalid_arg);
82 minput_close_im (mplist_value (value));
87 parse_arg_common (MPlist *arg, MSymbol *lang, MSymbol *name, MSymbol *target)
90 *lang = Mt, *name = Mnil, *target = Mnil;
95 *lang = mplist_value (arg);
96 arg = mplist_next (arg);
99 *name = mplist_value (arg);
100 arg = mplist_next (arg);
103 *target = mplist_value (arg);
104 arg = mplist_next (arg);
106 else if (TAILP (arg))
115 call_get_common (MPlist *(*func) (MSymbol, MSymbol, MSymbol), MPlist *arg)
117 MSymbol lang, name, target;
119 arg = parse_arg_common (arg, &lang, &name, &target);
121 ERROR (error_invalid_arg);
124 arg = func (lang, name, target);
126 ERROR (error_command_fail);
127 /* Prevent it be freed. */
128 m17n_object_ref (arg);
133 eval_get_command (MPlist *arg)
135 return call_get_common (minput_get_command, arg);
139 eval_get_variable (MPlist *arg)
141 return call_get_common (minput_get_variable, arg);
145 call_config_common (int (*func) (MSymbol, MSymbol, MSymbol, MPlist *),
148 MSymbol lang, name, target;
150 arg = parse_arg_common (arg, &lang, &name, &target);
152 ERROR (error_invalid_arg);
155 if (func (lang, name, target, arg) < 0)
156 ERROR (error_command_fail);
161 eval_config_command (MPlist *arg)
163 return call_config_common (minput_config_command, arg);
167 eval_config_variable (MPlist *arg)
169 return call_config_common (minput_config_variable, arg);
173 eval_save_config (MPlist *arg)
175 int ret = minput_save_config ();
178 ERROR (error_command_fail);
180 ERROR (error_lock_fail);
185 MPlist *(*eval_func) (MPlist *arg);
188 { {eval_help, "help"},
189 {eval_set, "set SYMBOL FORM"},
190 {eval_open, "open LANG NAME"},
191 {eval_close, "close SYMBOL"},
192 {eval_get_command, "get-command [LANG NAME [COMMAND]]"},
193 {eval_config_command, "config-command LANG NAME [COMMAND [(KEY ...) ...]]"},
194 {eval_get_variable, "get-variable [LANG NAME [VARIABLE]]"},
195 {eval_config_variable, "config-variable LANG NAME [VARIABLE [VALUE]]"},
196 {eval_save_config, "save-config"} };
199 eval_help (MPlist *arg)
203 printf ("Valid FORMs are:\n");
204 for (i = 0; i < (sizeof eval_functions) / (sizeof eval_functions[0]); i++)
205 printf (" %s\n", eval_functions[i].form);
206 printf (" SYMBOL -- print the value of SYMBOL\n");
214 struct EvalFunc *eval_func;
216 if (! SYMBOLP (plist))
217 ERROR (error_invalid_format);
218 cmd = mplist_value (plist);
219 eval_func = msymbol_get (cmd, Meval_function);
222 if (mplist_key (mplist_next (plist)) == Mnil)
224 MPlist *value = msymbol_get (cmd, Mvalue);
229 ERROR (error_unknown_command);
232 return eval_func->eval_func (mplist_next (plist));
240 Merror = msymbol ("error");
241 Mvalue = msymbol ("value");
243 Meval_function = msymbol ("eval-function");
244 msymbol_put (msymbol ("help"), Meval_function, eval_functions + 0);
245 msymbol_put (msymbol ("set"), Meval_function, eval_functions + 1);
246 msymbol_put (msymbol ("open"), Meval_function, eval_functions + 2);
247 msymbol_put (msymbol ("close"), Meval_function, eval_functions + 3);
248 msymbol_put (msymbol ("get-command"), Meval_function, eval_functions + 4);
249 msymbol_put (msymbol ("config-command"), Meval_function, eval_functions + 5);
250 msymbol_put (msymbol ("get-variable"), Meval_function, eval_functions + 6);
251 msymbol_put (msymbol ("config-variable"), Meval_function, eval_functions + 7);
252 msymbol_put (msymbol ("save-config"), Meval_function, eval_functions + 8);
254 error_invalid_format = mplist ();
255 mplist_add (error_invalid_format, Msymbol, Merror);
256 mplist_add (error_invalid_format, Msymbol, msymbol ("invalid-format"));
258 error_unknown_command = mplist ();
259 mplist_add (error_unknown_command, Msymbol, Merror);
260 mplist_add (error_unknown_command, Msymbol, msymbol ("unknwon-command"));
262 error_invalid_arg = mplist ();
263 mplist_add (error_invalid_arg, Msymbol, Merror);
264 mplist_add (error_invalid_arg, Msymbol, msymbol ("invalid-argument"));
266 error_command_fail = mplist ();
267 mplist_add (error_command_fail, Msymbol, Merror);
268 mplist_add (error_command_fail, Msymbol, msymbol ("command-fail"));
270 error_lock_fail = mplist ();
271 mplist_add (error_lock_fail, Msymbol, Merror);
272 mplist_add (error_lock_fail, Msymbol, msymbol ("lock-fail"));
278 m17n_object_unref (error_invalid_format);
279 m17n_object_unref (error_unknown_command);
280 m17n_object_unref (error_invalid_arg);
281 m17n_object_unref (error_command_fail);
282 m17n_object_unref (error_lock_fail);
294 while (printf ("> ") && fgets (line, 256, stdin) != NULL)
298 int len = strlen (line);
300 if (line[len - 1] == '\n')
305 mt = mtext_from_data (line, len, MTEXT_FORMAT_US_ASCII);
306 plist = mplist_deserialize (mt);
311 mdebug_dump_plist (val, 0);
314 m17n_object_unref (val);
316 m17n_object_unref (plist);
317 m17n_object_unref (mt);