- if (cmd == Mset)
- return eval_set (mplist_next (plist));
- if (cmd == Mopen)
- return eval_open (mplist_next (plist));
- if (cmd == Mclose)
- return eval_close (mplist_next (plist));
- if (cmd == Mget_command)
- return eval_get_command (mplist_next (plist));
- if (cmd == Mget_variable)
- return eval_get_variable (mplist_next (plist));
- if (cmd == Mconfig_command)
- return eval_config_command (mplist_next (plist));
- if (cmd == Mconfig_variable)
- return eval_config_variable (mplist_next (plist));
- return error_unknown_command;
+ eval_func = msymbol_get (cmd, Meval_function);
+ if (! eval_func)
+ {
+ if (mplist_key (mplist_next (plist)) == Mnil)
+ {
+ MPlist *value = msymbol_get (cmd, Mvalue);
+
+ if (value)
+ return value;
+ }
+ ERROR (error_unknown_command);
+ }
+
+ return eval_func->eval_func (mplist_next (plist));
+}
+
+void
+init (void)
+{
+ Merror = msymbol ("error");
+ Mvalue = msymbol ("value");
+
+ Meval_function = msymbol ("eval-function");
+ msymbol_put (msymbol ("set"), Meval_function, eval_functions + 0);
+ msymbol_put (msymbol ("open"), Meval_function, eval_functions + 1);
+ msymbol_put (msymbol ("close"), Meval_function, eval_functions + 2);
+ msymbol_put (msymbol ("get-command"), Meval_function, eval_functions + 3);
+ msymbol_put (msymbol ("config-command"), Meval_function, eval_functions + 4);
+ msymbol_put (msymbol ("get-variable"), Meval_function, eval_functions + 5);
+ msymbol_put (msymbol ("config-variable"), Meval_function, eval_functions + 6);
+ msymbol_put (msymbol ("save-config"), Meval_function, eval_functions + 7);
+
+ error_invalid_format = mplist ();
+ mplist_add (error_invalid_format, Msymbol, Merror);
+ mplist_add (error_invalid_format, Msymbol, msymbol ("invalid-format"));
+
+ error_unknown_command = mplist ();
+ mplist_add (error_unknown_command, Msymbol, Merror);
+ mplist_add (error_unknown_command, Msymbol, msymbol ("unknwon-command"));
+
+ error_invalid_arg = mplist ();
+ mplist_add (error_invalid_arg, Msymbol, Merror);
+ mplist_add (error_invalid_arg, Msymbol, msymbol ("invalid-argument"));
+
+ error_command_fail = mplist ();
+ mplist_add (error_command_fail, Msymbol, Merror);
+ mplist_add (error_command_fail, Msymbol, msymbol ("command-fail"));
+
+ error_lock_fail = mplist ();
+ mplist_add (error_lock_fail, Msymbol, Merror);
+ mplist_add (error_lock_fail, Msymbol, msymbol ("lock-fail"));
+}
+
+void
+fini (void)
+{
+ m17n_object_unref (error_invalid_format);
+ m17n_object_unref (error_unknown_command);
+ m17n_object_unref (error_invalid_arg);
+ m17n_object_unref (error_command_fail);