eb039144d7880a2aa033c05f562fd50e21e09e26
[m17n/m17n-test.git] / run-im.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <m17n.h>
5 #include <m17n-misc.h>
6
7 MPlist *error_invalid_format;
8 MPlist *error_unknown_command;
9 MPlist *error_invalid_arg;
10
11 MSymbol Merror;
12 MSymbol Mset, Mopen, Mclose;
13 MSymbol Mget_command, Mconfig_command, Mget_variable, Mconfig_variable;
14
15 void
16 init (void)
17 {
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");
26
27   error_invalid_format = mplist ();
28   mplist_add (error_invalid_format, Msymbol, Merror);
29   mplist_add (error_invalid_format, Msymbol, msymbol ("invalid-format"));
30
31   error_unknown_command = mplist ();
32   mplist_add (error_unknown_command, Msymbol, Merror);
33   mplist_add (error_unknown_command, Msymbol, msymbol ("unknwon-command"));
34
35   error_invalid_arg = mplist ();
36   mplist_add (error_invalid_arg, Msymbol, Merror);
37   mplist_add (error_invalid_arg, Msymbol, msymbol ("invalid-argument"));
38 }
39
40 MPlist *eval (MPlist *);
41
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)
47
48 MPlist *
49 eval_set (MPlist *arg)
50 {
51   MSymbol var;
52   MPlist *plist;
53
54   if (! SYMBOLP (arg))
55     return error_invalid_arg;
56   var = mplist_value (arg);
57   arg = mplist_next (arg);
58   if (TAILP (arg))
59     msymbol_put (var, Mplist, NULL);
60   else if (PLISTP (arg))
61     {
62       arg = eval (mplist_value (arg));
63       msymbol_put (var, Mplist, arg);
64     }
65   else
66     {
67       msymbol_put (var, Mplist, arg);
68     }
69   return NULL;
70 }
71
72 MPlist *
73 eval_open (MPlist *arg)
74 {
75   MPlist *plist;
76   MSymbol lang, name;
77   MInputMethod *im;;
78
79   if (! SYMBOLP (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);
87   plist = mplist ();
88   mplist_add (plist, Mt, im);
89   return plist;
90 }
91
92 MPlist *
93 eval_close (MPlist *arg)
94 {
95   MPlist *plist;
96
97   if (! SYMBOLP (arg))
98     return error_invalid_arg;
99   plist = mplist_get (vars, mplist_value (arg));
100   if (! plist)
101     return error_invalid_arg;
102   minput_close_im (mplist_value (plist));
103   return NULL;
104 }
105
106 MPlist *
107 eval_get_command (MPlist *arg)
108 {
109   MPlist *plist;
110   MSymbol lang, name, command;
111
112   if (! SYMBOLP (arg))
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);
120   if (SYMBOLP (arg))
121     command = mplist_value (arg);
122   else if (TAILP (arg))
123     command = Mnil;
124   else
125     return error_invalid_arg;
126   return minput_get_command (lang, name, command);
127 }
128
129 MPlist *
130 eval_config_command (MPlist *arg)
131 {
132   return NULL;
133 }
134
135 MPlist *
136 eval_get_variable (MPlist *arg)
137 {
138   MPlist *plist;
139   MSymbol lang, name, variable;
140
141   if (! SYMBOLP (arg))
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);
149   if (SYMBOLP (arg))
150     variable = mplist_value (arg);
151   else if (TAILP (arg))
152     variable = Mnil;
153   else
154     return error_invalid_arg;
155   return minput_get_variable (lang, name, variable);
156 }
157
158 MPlist *
159 eval_config_variable (MPlist *arg)
160 {
161   return NULL;
162 }
163
164 MPlist *
165 eval (MPlist *plist)
166 {
167   MSymbol cmd;
168
169   if (! SYMBOLP (plist))
170     return error_invalid_format;
171   cmd = mplist_value (plist);
172   if (cmd == Mset)
173     return eval_set (mplist_next (plist));
174   if (cmd == Mopen)
175     return eval_open (mplist_next (plist));
176   if (cmd == Mclose)
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;
187 }
188
189 int
190 main ()
191 {
192   char line[256];
193
194   M17N_INIT ();
195   init ();
196
197   while (fgets (line, 256, stdin) != NULL)
198     {
199       MText *mt = mtext_from_data (line, strlen (line), MTEXT_FORMAT_US_ASCII);
200       MPlist *plist = mplist_deserialize (mt);
201       MPlist *val = eval (plist);
202
203       if (val)
204         {
205           mdebug_dump_plist (val, 0);
206           fputc ('\n', stderr);
207           fflush (stderr);
208         }
209       m17n_object_unref (plist);
210       m17n_object_unref (mt);
211     }
212
213   M17N_FINI ();
214   exit (0);
215 }
216
217