| 69 c->id = id; |
69 c->id = id; |
| 70 c->cmd = g_strdup(cmd); |
70 c->cmd = g_strdup(cmd); |
| 71 c->args = g_strdup(args); |
71 c->args = g_strdup(args); |
| 72 c->priority = p; |
72 c->priority = p; |
| 73 c->flags = f; |
73 c->flags = f; |
| 74 c->prpl_id = prpl_id ? g_strdup(prpl_id) : NULL; |
74 c->prpl_id = g_strdup(prpl_id); |
| 75 c->func = func; |
75 c->func = func; |
| 76 c->help = helpstr ? g_strdup(helpstr) : NULL; |
76 c->help = g_strdup(helpstr); |
| 77 c->data = data; |
77 c->data = data; |
| 78 |
78 |
| 79 cmds = g_list_insert_sorted(cmds, c, (GCompareFunc)cmds_compare_func); |
79 cmds = g_list_insert_sorted(cmds, c, (GCompareFunc)cmds_compare_func); |
| 80 |
80 |
| 81 return id; |
81 return id; |
| 107 return; |
104 return; |
| 108 } |
105 } |
| 109 } |
106 } |
| 110 } |
107 } |
| 111 |
108 |
| |
109 /** |
| |
110 * This sets args to a NULL-terminated array of strings. It should |
| |
111 * be freed using g_strfreev(). |
| |
112 */ |
| 112 static gboolean gaim_cmd_parse_args(GaimCmd *cmd, const gchar *s, const gchar *m, gchar ***args) |
113 static gboolean gaim_cmd_parse_args(GaimCmd *cmd, const gchar *s, const gchar *m, gchar ***args) |
| 113 { |
114 { |
| 114 int i; |
115 int i; |
| 115 const char *end, *cur; |
116 const char *end, *cur; |
| 116 |
117 |
| 140 cur = end; |
141 cur = end; |
| 141 } else { |
142 } else { |
| 142 (*args)[i] = gaim_markup_slice(m, g_utf8_pointer_to_offset(s, cur), g_utf8_pointer_to_offset(s, end)); |
143 (*args)[i] = gaim_markup_slice(m, g_utf8_pointer_to_offset(s, cur), g_utf8_pointer_to_offset(s, end)); |
| 143 cur = end +1; |
144 cur = end +1; |
| 144 } |
145 } |
| 145 break; |
146 break; |
| 146 case 's': |
147 case 's': |
| 147 (*args)[i] = g_strdup(cur); |
148 (*args)[i] = g_strdup(cur); |
| 148 cur = cur + strlen(cur); |
149 cur = cur + strlen(cur); |
| 149 break; |
150 break; |
| 150 case 'S': |
151 case 'S': |
| 258 |
250 |
| 259 right_prpl = TRUE; |
251 right_prpl = TRUE; |
| 260 |
252 |
| 261 /* this checks the allow bad args flag for us */ |
253 /* this checks the allow bad args flag for us */ |
| 262 if (!gaim_cmd_parse_args(c, rest, mrest, &args)) { |
254 if (!gaim_cmd_parse_args(c, rest, mrest, &args)) { |
| 263 gaim_cmd_free_args(args); |
255 g_strfreev(args); |
| 264 args = NULL; |
256 args = NULL; |
| 265 continue; |
257 continue; |
| 266 } |
258 } |
| 267 |
259 |
| 268 tried_cmd = TRUE; |
260 tried_cmd = TRUE; |
| 269 ret = c->func(conv, cmd, args, &err, c->data); |
261 ret = c->func(conv, cmd, args, &err, c->data); |
| 270 if (ret == GAIM_CMD_RET_CONTINUE) { |
262 if (ret == GAIM_CMD_RET_CONTINUE) { |
| 271 if (err) |
263 g_free(err); |
| 272 g_free(err); |
|
| 273 err = NULL; |
264 err = NULL; |
| 274 gaim_cmd_free_args(args); |
265 g_strfreev(args); |
| 275 args = NULL; |
266 args = NULL; |
| 276 continue; |
267 continue; |
| 277 } else { |
268 } else { |
| 278 break; |
269 break; |
| 279 } |
270 } |
| 280 |
271 |
| 281 } |
272 } |
| 282 |
273 |
| 283 if (args) |
274 g_strfreev(args); |
| 284 gaim_cmd_free_args(args); |
|
| 285 g_free(cmd); |
275 g_free(cmd); |
| 286 g_free(mrest); |
276 g_free(mrest); |
| 287 |
277 |
| 288 if (!found) |
278 if (!found) |
| 289 return GAIM_CMD_STATUS_NOT_FOUND; |
279 return GAIM_CMD_STATUS_NOT_FOUND; |