7 MPlist *error_invalid_format;
8 MPlist *error_unknown_command;
9 MPlist *error_invalid_arg;
12 MSymbol Mset, Mopen, Mclose;
13 MSymbol Mget_command, Mconfig_command, Mget_variable, Mconfig_variable;
18 Merror = msymbol ("error");
19 Mset = msymbol ("set");
20 Mopen = msymbol ("open");
21 Mclose = msymbol ("close");
22 Mget_command = msymbol ("get-command");
23 Mconfig_command = msymbol ("config-command");
24 Mget_variable = msymbol ("get-variable");
25 Mconfig_variable = msymbol ("config-variable");
27 error_invalid_format = mplist ();
28 mplist_add (error_invalid_format, Msymbol, Merror);
29 mplist_add (error_invalid_format, Msymbol, msymbol ("invalid-format"));
31 error_unknown_command = mplist ();
32 mplist_add (error_unknown_command, Msymbol, Merror);
33 mplist_add (error_unknown_command, Msymbol, msymbol ("unknwon-command"));
35 error_invalid_arg = mplist ();
36 mplist_add (error_invalid_arg, Msymbol, Merror);
37 mplist_add (error_invalid_arg, Msymbol, msymbol ("invalid-argument"));
40 MPlist *eval (MPlist *);
42 #define INTEGERP(plist) (mplist_key (plist) == Minteger)
43 #define SYMBOLP(plist) (mplist_key (plist) == Msymbol)
44 #define MTEXTP(plist) (mplist_key (plist) == Mtext)
45 #define PLISTP(plist) (mplist_key (plist) == Mplist)
46 #define TAILP(plist) (mplist_key (plist) == Mnil)
49 eval_set (MPlist *arg)
55 return error_invalid_arg;
56 var = mplist_value (arg);
57 arg = mplist_next (arg);
59 msymbol_put (var, Mplist, NULL);
60 else if (PLISTP (arg))
62 arg = eval (mplist_value (arg));
63 msymbol_put (var, Mplist, arg);
67 msymbol_put (var, Mplist, arg);
73 eval_open (MPlist *arg)
80 return error_invalid_arg;
81 lang = mplist_value (arg);
82 plist = mplist_next (arg);
83 if (! SYMBOLP (plist))
84 return error_invalid_arg;
85 name = mplist_value (plist);
86 im = minput_open_im (lang, name, Mnil);
88 mplist_add (plist, Mt, im);
93 eval_close (MPlist *arg)
98 return error_invalid_arg;
99 plist = mplist_get (vars, mplist_value (arg));
101 return error_invalid_arg;
102 minput_close_im (mplist_value (plist));
107 eval_get_command (MPlist *arg)
110 MSymbol lang, name, command;
113 return error_invalid_arg;
114 lang = mplist_value (arg);
115 plist = mplist_next (arg);
116 if (! SYMBOLP (plist))
117 return error_invalid_arg;
118 name = mplist_value (plist);
119 plist = mplist_next (arg);
121 command = mplist_value (arg);
122 else if (TAILP (arg))
125 return error_invalid_arg;
126 return minput_get_command (lang, name, command);
130 eval_config_command (MPlist *arg)
136 eval_get_variable (MPlist *arg)
139 MSymbol lang, name, variable;
142 return error_invalid_arg;
143 lang = mplist_value (arg);
144 plist = mplist_next (arg);
145 if (! SYMBOLP (plist))
146 return error_invalid_arg;
147 name = mplist_value (plist);
148 plist = mplist_next (arg);
150 variable = mplist_value (arg);
151 else if (TAILP (arg))
154 return error_invalid_arg;
155 return minput_get_variable (lang, name, variable);
159 eval_config_variable (MPlist *arg)
169 if (! SYMBOLP (plist))
170 return error_invalid_format;
171 cmd = mplist_value (plist);
173 return eval_set (mplist_next (plist));
175 return eval_open (mplist_next (plist));
177 return eval_close (mplist_next (plist));
178 if (cmd == Mget_command)
179 return eval_get_command (mplist_next (plist));
180 if (cmd == Mget_variable)
181 return eval_get_variable (mplist_next (plist));
182 if (cmd == Mconfig_command)
183 return eval_config_command (mplist_next (plist));
184 if (cmd == Mconfig_variable)
185 return eval_config_variable (mplist_next (plist));
186 return error_unknown_command;
197 while (fgets (line, 256, stdin) != NULL)
199 MText *mt = mtext_from_data (line, strlen (line), MTEXT_FORMAT_US_ASCII);
200 MPlist *plist = mplist_deserialize (mt);
201 MPlist *val = eval (plist);
205 mdebug_dump_plist (val, 0);
206 fputc ('\n', stderr);
209 m17n_object_unref (plist);
210 m17n_object_unref (mt);