181 - } else if (!strncasecmp(subcmd, "search", 6)) { |
182 - } else if (!strncasecmp(subcmd, "search", 6)) { |
182 - strip_arg_special_chars(arg); |
183 - strip_arg_special_chars(arg); |
183 - if (!arg || !*arg) { |
184 - if (!arg || !*arg) { |
184 - scr_LogPrint(LPRINT_NORMAL, "What name or JID are you looking for?"); |
185 - scr_LogPrint(LPRINT_NORMAL, "What name or JID are you looking for?"); |
185 - free_arg_lst(paramlst); |
186 - free_arg_lst(paramlst); |
186 - return; |
|
187 - } |
|
188 + } else if (subcmd == roster_scmd_search) { |
187 + } else if (subcmd == roster_scmd_search) { |
189 scr_roster_search(arg); |
188 + scr_roster_search(arg); |
190 update_roster = TRUE; |
189 + update_roster = TRUE; |
|
190 + } else if (subcmd == roster_scmd_up) { |
|
191 + roster_updown(-1, arg); |
|
192 + } else if (subcmd == roster_scmd_down) { |
|
193 + roster_updown(1, arg); |
|
194 + } else if (subcmd == roster_scmd_group_prev) { |
|
195 + scr_roster_prev_group(); |
|
196 + } else if (subcmd == roster_scmd_group_next) { |
|
197 + scr_roster_next_group(); |
|
198 + } else if (subcmd == roster_scmd_note) { |
|
199 + roster_note(arg); |
|
200 + } else if (subcmd == roster_scmd_resource_lock) { |
|
201 + roster_resourcelock(arg, TRUE); |
|
202 + } else { // roster_scmd_resource_unlock |
|
203 + roster_resourcelock(arg, FALSE); |
|
204 + } |
|
205 + |
|
206 + cmdopts_free(&options); |
|
207 +} |
|
208 + |
|
209 +void do_color(char *arg) |
|
210 +{ |
|
211 + enum color_scmd_t { |
|
212 + color_scmd_roster, |
|
213 + color_scmd_mucnick, |
|
214 + color_scmd_muc, |
|
215 + } subcmd; |
|
216 + cmdopts_t options = { |
|
217 + NULL, |
|
218 + (cmdarg_t[1]){ |
|
219 + { CMDOPT_REQUIRED | CMDOPT_SUBCOMMAND | CMDOPT_LAST, { .cmd = NULL } }, |
|
220 + }, |
|
221 + (subcmd_t[3]){ |
|
222 + { 0, "roster", |
|
223 + { |
|
224 + NULL, |
|
225 + (cmdarg_t[3]){ |
|
226 + { CMDOPT_REQUIRED, { .arg = NULL } }, // status mask or "clear" |
|
227 + { 0, { .arg = NULL } }, // jid mask |
|
228 + { CMDOPT_LAST, { .arg = NULL } }, // color |
|
229 + }, |
|
230 + NULL, |
|
231 + NULL, |
|
232 + }, |
|
233 + (gpointer)color_scmd_roster, |
|
234 + }, |
|
235 + { 0, "muc", |
|
236 + { |
|
237 + NULL, |
|
238 + (cmdarg_t[2]){ |
|
239 + { CMDOPT_REQUIRED, { .arg = NULL } }, // jid |
|
240 + { CMDOPT_LAST, { .arg = "on" } }, // on/off/preset/- |
|
241 + }, |
|
242 + NULL, |
|
243 + NULL, |
|
244 + }, |
|
245 + (gpointer)color_scmd_muc, |
|
246 + }, |
|
247 + { CMDOPT_LAST, "mucnick", |
|
248 + { |
|
249 + NULL, |
|
250 + (cmdarg_t[2]){ |
|
251 + { CMDOPT_REQUIRED, { .arg = NULL } }, // nick |
|
252 + { CMDOPT_REQUIRED | CMDOPT_LAST, { .arg = NULL } }, // color |
|
253 + }, |
|
254 + NULL, |
|
255 + NULL, |
|
256 + }, |
|
257 + (gpointer)color_scmd_mucnick, |
|
258 + }, |
|
259 + }, |
|
260 + NULL, |
|
261 + }; |
|
262 + |
|
263 + { |
|
264 + const char *error = cmdopts_parse(arg, &options); |
|
265 + if (error != NULL) { |
|
266 + scr_log_print(LPRINT_NORMAL, error); |
|
267 return; |
|
268 } |
|
269 - scr_roster_search(arg); |
|
270 - update_roster = TRUE; |
191 - } else if (!strcasecmp(subcmd, "up")) { |
271 - } else if (!strcasecmp(subcmd, "up")) { |
192 + } else if (subcmd == roster_scmd_up) { |
272 - roster_updown(-1, arg); |
193 roster_updown(-1, arg); |
|
194 - } else if (!strcasecmp(subcmd, "down")) { |
273 - } else if (!strcasecmp(subcmd, "down")) { |
195 + } else if (subcmd == roster_scmd_down) { |
274 - roster_updown(1, arg); |
196 roster_updown(1, arg); |
|
197 - } else if (!strcasecmp(subcmd, "group_prev")) { |
275 - } else if (!strcasecmp(subcmd, "group_prev")) { |
198 + } else if (subcmd == roster_scmd_group_prev) { |
276 - scr_roster_prev_group(); |
199 scr_roster_prev_group(); |
|
200 - } else if (!strcasecmp(subcmd, "group_next")) { |
277 - } else if (!strcasecmp(subcmd, "group_next")) { |
201 + } else if (subcmd == roster_scmd_group_next) { |
278 - scr_roster_next_group(); |
202 scr_roster_next_group(); |
|
203 - } else if (!strcasecmp(subcmd, "note")) { |
279 - } else if (!strcasecmp(subcmd, "note")) { |
204 + } else if (subcmd == roster_scmd_note) { |
280 - roster_note(arg); |
205 roster_note(arg); |
|
206 - } else if (!strcasecmp(subcmd, "resource_lock")) { |
281 - } else if (!strcasecmp(subcmd, "resource_lock")) { |
207 + } else if (subcmd == roster_scmd_resource_lock) { |
282 - roster_resourcelock(arg, TRUE); |
208 roster_resourcelock(arg, TRUE); |
|
209 - } else if (!strcasecmp(subcmd, "resource_unlock")) { |
283 - } else if (!strcasecmp(subcmd, "resource_unlock")) { |
210 + } else { // roster_resource_unlock |
284 - roster_resourcelock(arg, FALSE); |
211 roster_resourcelock(arg, FALSE); |
|
212 - } else |
285 - } else |
213 - scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!"); |
286 - scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!"); |
214 - free_arg_lst(paramlst); |
287 - free_arg_lst(paramlst); |
|
288 -} |
|
289 - |
|
290 -void do_color(char *arg) |
|
291 -{ |
|
292 - char **paramlst; |
|
293 - char *subcmd; |
|
294 - |
|
295 - paramlst = split_arg(arg, 2, 1); // subcmd, arg |
|
296 - subcmd = *paramlst; |
|
297 - arg = *(paramlst+1); |
|
298 - |
|
299 - if (!subcmd || !*subcmd) { |
|
300 - scr_LogPrint(LPRINT_NORMAL, "Missing parameter."); |
|
301 - free_arg_lst(paramlst); |
|
302 - return; |
|
303 } |
|
304 - |
|
305 - if (!strcasecmp(subcmd, "roster")) { |
|
306 - char *status, *wildcard, *color; |
|
307 - char **arglist = split_arg(arg, 3, 0); |
|
308 - |
|
309 - status = *arglist; |
|
310 - wildcard = to_utf8(arglist[1]); |
|
311 - color = arglist[2]; |
|
312 - |
|
313 - if (status && !strcmp(status, "clear")) { // Not a color command, clear all |
|
314 + |
|
315 + subcmd = (enum color_scmd_t) options.args[0].value.cmd -> userdata; |
|
316 + |
|
317 + if (subcmd == color_scmd_roster) { |
|
318 + const gchar *status = options.cmds[0].options.args[0].value.arg; |
|
319 + const gchar *wildcard = options.cmds[0].options.args[1].value.arg; |
|
320 + const gchar *color = options.cmds[0].options.args[2].value.arg; |
|
321 + if (!strcmp(status, "clear")) { // Not a color command, clear all |
|
322 scr_roster_clear_color(); |
|
323 update_roster = TRUE; |
|
324 } else { |
|
325 - if (!status || !*status || !wildcard || !*wildcard || !color || !*color) { |
|
326 - scr_LogPrint(LPRINT_NORMAL, "Missing argument"); |
|
327 + if (!*status || !wildcard || !*wildcard || !color || !*color) { |
|
328 + scr_log_print(LPRINT_NORMAL, "Missing argument"); |
|
329 } else { |
|
330 update_roster = scr_roster_color(status, wildcard, color) || |
|
331 update_roster; |
|
332 } |
|
333 } |
|
334 - free_arg_lst(arglist); |
|
335 - g_free(wildcard); |
|
336 - } else if (!strcasecmp(subcmd, "muc")) { |
|
337 - char **arglist = split_arg(arg, 2, 0); |
|
338 - char *free_muc = to_utf8(*arglist); |
|
339 - const char *muc = free_muc, *mode = arglist[1]; |
|
340 - if (!muc || !*muc) |
|
341 - scr_LogPrint(LPRINT_NORMAL, "What MUC?"); |
|
342 - else { |
|
343 - if (!strcmp(muc, ".")) |
|
344 - if (!(muc = CURRENT_JID)) |
|
345 - scr_LogPrint(LPRINT_NORMAL, "No JID selected"); |
|
346 - if (muc) { |
|
347 - if (check_jid_syntax(muc) && strcmp(muc, "*")) |
|
348 - scr_LogPrint(LPRINT_NORMAL, "Not a JID"); |
|
349 - else { |
|
350 - if (!mode || !*mode || !strcasecmp(mode, "on")) |
|
351 - scr_muc_color(muc, MC_ALL); |
|
352 - else if (!strcasecmp(mode, "preset")) |
|
353 - scr_muc_color(muc, MC_PRESET); |
|
354 - else if (!strcasecmp(mode, "off")) |
|
355 - scr_muc_color(muc, MC_OFF); |
|
356 - else if (!strcmp(mode, "-")) |
|
357 - scr_muc_color(muc, MC_REMOVE); |
|
358 - else |
|
359 - scr_LogPrint(LPRINT_NORMAL, "Unknown coloring mode"); |
|
360 - } |
|
361 + } else if (subcmd == color_scmd_muc) { |
|
362 + const gchar *muc = options.cmds[1].options.args[0].value.arg; |
|
363 + const gchar *mode = options.cmds[1].options.args[1].value.arg; |
|
364 + if (!strcmp(muc, ".")) |
|
365 + if (!(muc = CURRENT_JID)) |
|
366 + scr_LogPrint(LPRINT_NORMAL, "No JID selected"); |
|
367 + if (muc) { |
|
368 + if (check_jid_syntax(muc) && strcmp(muc, "*")) |
|
369 + scr_LogPrint(LPRINT_NORMAL, "Not a JID"); |
|
370 + else { |
|
371 + if (!strcasecmp(mode, "on")) |
|
372 + scr_muc_color(muc, MC_ALL); |
|
373 + else if (!strcasecmp(mode, "preset")) |
|
374 + scr_muc_color(muc, MC_PRESET); |
|
375 + else if (!strcasecmp(mode, "off")) |
|
376 + scr_muc_color(muc, MC_OFF); |
|
377 + else if (!strcmp(mode, "-")) |
|
378 + scr_muc_color(muc, MC_REMOVE); |
|
379 + else |
|
380 + scr_LogPrint(LPRINT_NORMAL, "Unknown coloring mode"); |
|
381 } |
|
382 } |
|
383 - free_arg_lst(arglist); |
|
384 - g_free(free_muc); |
|
385 - } else if (!strcasecmp(subcmd, "mucnick")) { |
|
386 - char **arglist = split_arg(arg, 2, 0); |
|
387 - const char *nick = *arglist, *color = arglist[1]; |
|
388 - if (!nick || !*nick || !color || !*color) |
|
389 - scr_LogPrint(LPRINT_NORMAL, "Missing argument"); |
|
390 - else |
|
391 - scr_muc_nick_color(nick, color); |
|
392 - free_arg_lst(arglist); |
|
393 - } else |
|
394 - scr_LogPrint(LPRINT_NORMAL, "Unrecognized parameter!"); |
|
395 - free_arg_lst(paramlst); |
|
396 + } else { // color_scmd_mucnick |
|
397 + const gchar *nick = options.cmds[2].options.args[0].value.arg; |
|
398 + const gchar *color = options.cmds[2].options.args[1].value.arg; |
|
399 + scr_muc_nick_color(nick, color); |
215 + } |
400 + } |
216 + |
401 + |
217 + cmdopts_free(&options); |
402 + cmdopts_free(&options); |
218 } |
403 } |
219 |
404 |
220 void do_color(char *arg) |
405 // cmd_setstatus(recipient, arg) |
221 @@ -1634,130 +1679,109 @@ |
406 @@ -1634,130 +1711,109 @@ |
222 |
407 |
223 static void do_say_to(char *arg) |
408 static void do_say_to(char *arg) |
224 { |
409 { |
225 - char **paramlst; |
410 - char **paramlst; |
226 - char *fjid, *msg_utf8; |
411 - char *fjid, *msg_utf8; |