MPlist *error_invalid_format;
MPlist *error_unknown_command;
MPlist *error_invalid_arg;
+MPlist *error_command_fail;
+MPlist *error_lock_fail;
-MSymbol Merror;
-MSymbol Mset, Mopen, Mclose;
-MSymbol Mget_command, Mconfig_command, Mget_variable, Mconfig_variable;
+MSymbol Merror, Mvalue;
+MSymbol Meval_function;
-void
-init (void)
-{
- Merror = msymbol ("error");
- Mset = msymbol ("set");
- Mopen = msymbol ("open");
- Mclose = msymbol ("close");
- Mget_command = msymbol ("get-command");
- Mconfig_command = msymbol ("config-command");
- Mget_variable = msymbol ("get-variable");
- Mconfig_variable = msymbol ("config-variable");
-
- 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"));
-}
+#define ERROR(msg) \
+ do { \
+ m17n_object_ref (msg); \
+ return msg; \
+ } while (0)
MPlist *eval (MPlist *);
#define PLISTP(plist) (mplist_key (plist) == Mplist)
#define TAILP(plist) (mplist_key (plist) == Mnil)
+MPlist *eval_help (MPlist *arg);
+
MPlist *
eval_set (MPlist *arg)
{
MSymbol var;
- MPlist *plist;
if (! SYMBOLP (arg))
- return error_invalid_arg;
+ ERROR (error_invalid_arg);
var = mplist_value (arg);
arg = mplist_next (arg);
if (TAILP (arg))
- msymbol_put (var, Mplist, NULL);
+ msymbol_put (var, Mvalue, NULL);
else if (PLISTP (arg))
- {
- arg = eval (mplist_value (arg));
- msymbol_put (var, Mplist, arg);
- }
+ msymbol_put (var, Mvalue, eval (mplist_value (arg)));
else
{
- msymbol_put (var, Mplist, arg);
+ m17n_object_ref (arg);
+ msymbol_put (var, Mvalue, arg);
}
return NULL;
}
MPlist *
eval_open (MPlist *arg)
{
- MPlist *plist;
MSymbol lang, name;
MInputMethod *im;;
if (! SYMBOLP (arg))
- return error_invalid_arg;
+ ERROR (error_invalid_arg);
lang = mplist_value (arg);
- plist = mplist_next (arg);
- if (! SYMBOLP (plist))
- return error_invalid_arg;
- name = mplist_value (plist);
+ arg = mplist_next (arg);
+ if (! SYMBOLP (arg))
+ ERROR (error_invalid_arg);
+ name = mplist_value (arg);
im = minput_open_im (lang, name, Mnil);
- plist = mplist ();
- mplist_add (plist, Mt, im);
- return plist;
+ arg = mplist ();
+ mplist_add (arg, Mt, im);
+ return arg;
}
MPlist *
eval_close (MPlist *arg)
{
- MPlist *plist;
+ MPlist *value;
if (! SYMBOLP (arg))
- return error_invalid_arg;
- plist = mplist_get (vars, mplist_value (arg));
- if (! plist)
- return error_invalid_arg;
- minput_close_im (mplist_value (plist));
+ ERROR (error_invalid_arg);
+ value = msymbol_get (mplist_value (arg), Mvalue);
+ if (! value)
+ ERROR (error_invalid_arg);
+ minput_close_im (mplist_value (value));
return NULL;
}
MPlist *
eval_get_command (MPlist *arg)
{
- MPlist *plist;
MSymbol lang, name, command;
if (! SYMBOLP (arg))
- return error_invalid_arg;
+ ERROR (error_invalid_arg);
lang = mplist_value (arg);
- plist = mplist_next (arg);
- if (! SYMBOLP (plist))
- return error_invalid_arg;
- name = mplist_value (plist);
- plist = mplist_next (arg);
+ arg = mplist_next (arg);
+ if (! SYMBOLP (arg))
+ ERROR (error_invalid_arg);
+ name = mplist_value (arg);
+ arg = mplist_next (arg);
if (SYMBOLP (arg))
command = mplist_value (arg);
else if (TAILP (arg))
command = Mnil;
else
- return error_invalid_arg;
- return minput_get_command (lang, name, command);
+ ERROR (error_invalid_arg);
+ arg = minput_get_command (lang, name, command);
+ if (arg)
+ m17n_object_ref (arg);
+ return arg;
}
MPlist *
eval_config_command (MPlist *arg)
{
+ MSymbol lang, name, command;
+ MPlist *keyseq;
+
+ if (! SYMBOLP (arg))
+ ERROR (error_invalid_arg);
+ lang = mplist_value (arg);
+ arg = mplist_next (arg);
+ if (! SYMBOLP (arg))
+ ERROR (error_invalid_arg);
+ name = mplist_value (arg);
+ arg = mplist_next (arg);
+ if (SYMBOLP (arg))
+ {
+ command = mplist_value (arg);
+ arg = mplist_next (arg);
+ }
+ else if (TAILP (arg))
+ command = Mnil;
+ else
+ ERROR (error_invalid_arg);
+ if (PLISTP (arg))
+ keyseq = arg;
+ else
+ keyseq = NULL;
+ if (minput_config_command (lang, name, command, keyseq) < 0)
+ ERROR (error_command_fail);
return NULL;
}
MPlist *
eval_get_variable (MPlist *arg)
{
- MPlist *plist;
MSymbol lang, name, variable;
if (! SYMBOLP (arg))
- return error_invalid_arg;
+ ERROR (error_invalid_arg);
lang = mplist_value (arg);
- plist = mplist_next (arg);
- if (! SYMBOLP (plist))
- return error_invalid_arg;
- name = mplist_value (plist);
- plist = mplist_next (arg);
+ arg = mplist_next (arg);
+ if (! SYMBOLP (arg))
+ ERROR (error_invalid_arg);
+ name = mplist_value (arg);
+ arg = mplist_next (arg);
if (SYMBOLP (arg))
variable = mplist_value (arg);
else if (TAILP (arg))
variable = Mnil;
else
- return error_invalid_arg;
- return minput_get_variable (lang, name, variable);
+ ERROR (error_invalid_arg);
+ arg = minput_get_variable (lang, name, variable);
+ if (arg)
+ m17n_object_ref (arg);
+ return arg;
}
MPlist *
eval_config_variable (MPlist *arg)
{
+ MSymbol lang, name, variable;
+
+ if (! SYMBOLP (arg))
+ ERROR (error_invalid_arg);
+ lang = mplist_value (arg);
+ arg = mplist_next (arg);
+ if (! SYMBOLP (arg))
+ ERROR (error_invalid_arg);
+ name = mplist_value (arg);
+ arg = mplist_next (arg);
+ if (SYMBOLP (arg))
+ {
+ variable = mplist_value (arg);
+ arg = mplist_next (arg);
+ }
+ else if (TAILP (arg))
+ variable = Mnil;
+ else
+ ERROR (error_invalid_arg);
+ if (TAILP (arg))
+ arg = NULL;
+ if (minput_config_variable (lang, name, variable, arg) < 0)
+ ERROR (error_command_fail);
+ return NULL;
+}
+
+MPlist *
+eval_save_config (MPlist *arg)
+{
+ int ret = minput_save_config ();
+
+ if (ret < 0)
+ ERROR (error_command_fail);
+ if (ret == 0)
+ ERROR (error_lock_fail);
+ return NULL;
+}
+
+struct EvalFunc {
+ MPlist *(*eval_func) (MPlist *arg);
+ char *form;
+} eval_functions[] =
+ { {eval_help, "help"},
+ {eval_set, "set SYMBOL FORM"},
+ {eval_open, "open LANG NAME"},
+ {eval_close, "close SYMBOL"},
+ {eval_get_command, "get-command LANG NAME [COMMAND]"},
+ {eval_config_command, "config-command LANG NAME [COMMAND [(KEY ...) ...]]"},
+ {eval_get_variable, "get-variable LANG NAME [VARIABLE]"},
+ {eval_config_variable, "config-variable LANG NAME [VARIABLE [VALUE]]"},
+ {eval_save_config, "save-config"} };
+
+MPlist *
+eval_help (MPlist *arg)
+{
+ int i;
+
+ printf ("Valid FORMs are:\n");
+ for (i = 0; i < (sizeof eval_functions) / (sizeof eval_functions[0]); i++)
+ printf (" %s\n", eval_functions[i].form);
+ printf (" SYMBOL -- print the value of SYMBOL\n");
return NULL;
}
eval (MPlist *plist)
{
MSymbol cmd;
+ struct EvalFunc *eval_func;
if (! SYMBOLP (plist))
- return error_invalid_format;
+ ERROR (error_invalid_format);
cmd = mplist_value (plist);
- 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)
+{
+ M17N_INIT ();
+
+ Merror = msymbol ("error");
+ Mvalue = msymbol ("value");
+
+ Meval_function = msymbol ("eval-function");
+ msymbol_put (msymbol ("help"), Meval_function, eval_functions + 0);
+ msymbol_put (msymbol ("set"), Meval_function, eval_functions + 1);
+ msymbol_put (msymbol ("open"), Meval_function, eval_functions + 2);
+ msymbol_put (msymbol ("close"), Meval_function, eval_functions + 3);
+ msymbol_put (msymbol ("get-command"), Meval_function, eval_functions + 4);
+ msymbol_put (msymbol ("config-command"), Meval_function, eval_functions + 5);
+ msymbol_put (msymbol ("get-variable"), Meval_function, eval_functions + 6);
+ msymbol_put (msymbol ("config-variable"), Meval_function, eval_functions + 7);
+ msymbol_put (msymbol ("save-config"), Meval_function, eval_functions + 8);
+
+ 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);
+
+ M17N_FINI ();
}
int
{
char line[256];
- M17N_INIT ();
init ();
- while (fgets (line, 256, stdin) != NULL)
+ while (printf ("> ") && fgets (line, 256, stdin) != NULL)
{
- MText *mt = mtext_from_data (line, strlen (line), MTEXT_FORMAT_US_ASCII);
- MPlist *plist = mplist_deserialize (mt);
- MPlist *val = eval (plist);
+ MText *mt;
+ MPlist *plist, *val;
+ int len = strlen (line);
+
+ if (line[len - 1] == '\n')
+ line[--len] = '\0';
+ if (len == 0)
+ continue;
+
+ mt = mtext_from_data (line, len, MTEXT_FORMAT_US_ASCII);
+ plist = mplist_deserialize (mt);
+ val = eval (plist);
if (val)
{
mdebug_dump_plist (val, 0);
- fputc ('\n', stderr);
+ putc ('\n', stderr);
fflush (stderr);
+ m17n_object_unref (val);
}
m17n_object_unref (plist);
m17n_object_unref (mt);
}
- M17N_FINI ();
+ fini ();
exit (0);
}
-
-