gdImagePtr image;
int bg_color;
unsigned char *title;
- int allocated, len;
+ int title_len;
+ int allocated;
MSymbol utf8;
char *family_names = NULL;
utf8 = msymbol ("utf-8");
allocated = nchars * 4; /* Usually this is enough. */
title = malloc (allocated);
- len = mconv_encode_buffer (utf8, mt, title, allocated);
- while (len < 0 && merror_code == MCONVERSION_RESULT_INSUFFICIENT_DST)
+ title_len = mconv_encode_buffer (utf8, mt, title, allocated);
+ while (title_len < 0 && merror_code == MCONVERSION_RESULT_INSUFFICIENT_DST)
{
allocated += allocated;
title = realloc (title, allocated);
- len = mconv_encode_buffer (utf8, mt, title, allocated);
+ title_len = mconv_encode_buffer (utf8, mt, title, allocated);
}
- if (len < 0)
+ if (title_len < 0)
{
fprintf (stderr, "Encoding of native language name failed.");
exit (1);
}
- title[len] = '\0';
+ title[title_len] = '\0';
{
MPlist *param = mplist ();
mplist_add (param, Mdevice, msymbol ("gd"));
mplist_add (param, Mface, face);
frame = mframe (param);
+ m17n_object_unref (fontset);
m17n_object_unref (face);
m17n_object_unref (param);
guchar *pixels, *p;
int x, y;
PangoAttrList *attr_list;
- PangoAttribute *attr_size, *attr_family;
+ PangoAttribute *attr_size;
gtk_init (&argc, &argv);
attr_list = pango_attr_list_new ();
attr_size = pango_attr_size_new (FONT_PT_SIZE * PANGO_SCALE);
- attr_family = family_names ? pango_attr_family_new (family_names) : NULL;
-#if 0
- if (attr_family)
- pango_attr_list_change (attr_list, attr_family);
-#endif
- pango_attr_list_change (attr_list, attr_size);
+ attr_size->start_index = 0, attr_size->end_index = title_len;
+ pango_attr_list_insert (attr_list, attr_size);
+ if (family_names)
+ {
+ PangoAttribute *attr_family;
+
+ attr_family = pango_attr_family_new (family_names);
+ attr_family->start_index = 0, attr_family->end_index = title_len;
+ pango_attr_list_insert (attr_list, attr_family);
+ }
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, 0, 8,
metric.width, metric.height);
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 *);
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);
+} eval_functions[] =
+ { {eval_set}, {eval_open}, {eval_close}, {eval_get_command},
+ {eval_config_command}, {eval_get_variable}, {eval_config_variable},
+ {eval_save_config} };
+
+MPlist *
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)
+{
+ 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);
}
int
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;
+
+ if (line[strlen (line) - 1] == '\n')
+ line[strlen (line) - 1] = '\0';
+ mt = mtext_from_data (line, strlen (line), 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);
}
+ fini ();
M17N_FINI ();
exit (0);
}
-
-