source: commands.c @ d03091c

barnowl_perlaimdebianrelease-1.10release-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since d03091c was 4692b70, checked in by Nelson Elhage <nelhage@mit.edu>, 18 years ago
Exposing owl_function_error and owl_function_makemsg as commands
  • Property mode set to 100644
File size: 74.8 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <unistd.h>
5#include "owl.h"
6
7static const char fileIdent[] = "$Id$";
8
9/* fn is "char *foo(int argc, char **argv, char *buff)" */
10#define OWLCMD_ARGS(name, fn, ctx, summary, usage, description) \
11        { name, summary, usage, description, ctx, \
12          NULL, fn, NULL, NULL, NULL, NULL, NULL }
13
14/* fn is "void foo(void)" */
15#define OWLCMD_VOID(name, fn, ctx, summary, usage, description) \
16        { name, summary, usage, description, ctx, \
17          NULL, NULL, fn, NULL, NULL, NULL, NULL }
18
19/* fn is "void foo(int)" */
20#define OWLCMD_INT(name, fn, ctx, summary, usage, description) \
21        { name, summary, usage, description, ctx, \
22          NULL, NULL, NULL, fn, NULL, NULL, NULL }
23
24#define OWLCMD_ALIAS(name, actualname) \
25        { name, OWL_CMD_ALIAS_SUMMARY_PREFIX actualname, "", "", OWL_CTX_ANY, \
26          actualname, NULL, NULL, NULL, NULL, NULL, NULL }
27
28/* fn is "char *foo(void *ctx, int argc, char **argv, char *buff)" */
29#define OWLCMD_ARGS_CTX(name, fn, ctx, summary, usage, description) \
30        { name, summary, usage, description, ctx, \
31          NULL, NULL, NULL, NULL, ((char*(*)(void*,int,char**,char*))fn), NULL, NULL }
32
33/* fn is "void foo(void)" */
34#define OWLCMD_VOID_CTX(name, fn, ctx, summary, usage, description) \
35        { name, summary, usage, description, ctx, \
36          NULL, NULL, NULL, NULL, NULL, ((void(*)(void*))(fn)), NULL }
37
38/* fn is "void foo(int)" */
39#define OWLCMD_INT_CTX(name, fn, ctx, summary, usage, description) \
40        { name, summary, usage, description, ctx, \
41          NULL, NULL, NULL, NULL, NULL, NULL, ((void(*)(void*,int))fn) }
42
43
44owl_cmd commands_to_init[]
45  = {
46  OWLCMD_ARGS("zlog", owl_command_zlog, OWL_CTX_ANY,
47              "send a login or logout notification",
48              "zlog in [tty]\nzlog out",
49              "zlog in will send a login notification, zlog out will send a\n"
50              "logout notification.  By default a login notification is sent\n"
51              "when owl is started and a logout notification is sent when owl\n"
52              "is exited.  This behavior can be changed with the 'startuplogin'\n"
53              "and 'shudownlogout' variables.  If a tty is specified for zlog in\n"
54              "then the owl variable 'tty' will be set to that string, causing\n"
55              "it to be used as the zephyr location tty.\n"),
56
57  OWLCMD_VOID("quit", owl_command_quit, OWL_CTX_ANY,
58              "exit owl",
59              "",
60              "Exit owl and run any shutdown activities."),
61  OWLCMD_ALIAS("exit", "quit"),
62  OWLCMD_ALIAS("q",    "quit"),
63
64  OWLCMD_ARGS("term", owl_command_term, OWL_CTX_ANY,
65              "control the terminal",
66              "term raise\n"
67              "term deiconify\n",
68              ""),
69
70  OWLCMD_VOID("nop", owl_command_nop, OWL_CTX_ANY,
71              "do nothing",
72              "",
73              ""),
74 
75  OWLCMD_ARGS("start-command", owl_command_start_command, OWL_CTX_INTERACTIVE,
76              "prompts the user to enter a command",
77              "start-command [initial-value]",
78              "Initializes the command field to initial-value."),
79
80  OWLCMD_ARGS("start-question", owl_command_start_question, OWL_CTX_INTERACTIVE,
81              "prompts the user to enter a response to some question",
82              "start-command <question>",
83              ""),
84
85  OWLCMD_ARGS("start-password", owl_command_start_password, OWL_CTX_INTERACTIVE,
86              "prompts the user to enter a password",
87              "start-password <question>",
88              ""),
89
90  OWLCMD_ARGS("alias", owl_command_alias, OWL_CTX_ANY,
91              "creates a command alias",
92              "alias <new_command> <old_command>",
93              "Creates a command alias from new_command to old_command.\n"
94              "Any arguments passed to <new_command> will be appended to\n"
95              "<old_command> before it is executed.\n"),
96
97  OWLCMD_ARGS("bindkey", owl_command_bindkey, OWL_CTX_ANY,
98              "creates a binding in a keymap",
99              "bindkey <keymap> <keyseq> command <command>",
100              "Binds a key sequence to a command within a keymap.\n"
101              "Use 'show keymaps' to see the existing keymaps.\n"
102              "Key sequences may be things like M-C-t or NPAGE.\n"),
103
104  OWLCMD_ARGS("style", owl_command_style, OWL_CTX_ANY,
105              "creates a new style",
106              "style <name> perl <function_name>",
107              "Creates a new style for formatting messages.\n"
108              "A style named <name> will be created that will\n"
109              "format messages using the perl function <function_name>.\n\n"
110              "SEE ALSO: show styles, view -s, filter -s\n"),
111
112  OWLCMD_ARGS("zwrite", owl_command_zwrite, OWL_CTX_INTERACTIVE,
113              "send a zephyr",
114              "zwrite [-n] [-C] [-c class] [-i instance] [-r realm] [-O opcde] [<user> ...] [-m <message...>]",
115              "Zwrite send a zephyr to the one or more users specified.\n\n"
116              "The following options are available:\n\n"
117              "-m    Specifies a message to send without prompting.\n"
118              "      Note that this does not yet log an outgoing message.\n"
119              "      This must be the last argument.\n\n"
120              "-n    Do not send a ping message.\n\n"
121              "-C    If the message is sent to more than one user include a\n"
122              "      \"cc:\" line in the text\n\n"
123              "-c class\n"
124              "      Send to the specified zephyr class\n\n"
125              "-i instance\n"
126              "      Send to the specified zephyr instance\n\n"
127              "-r realm\n"
128              "      Send to a foreign realm\n"
129              "-O opcode\n"
130              "      Send to the specified opcode\n"),
131
132  OWLCMD_ARGS("aimwrite", owl_command_aimwrite, OWL_CTX_INTERACTIVE,
133              "send an AIM message",
134              "aimzwrite <user>",
135              "Send an aim message to a user.\n"),
136
137  OWLCMD_ARGS("loopwrite", owl_command_loopwrite, OWL_CTX_INTERACTIVE,
138              "send a loopback message",
139              "loopwrite",
140              "Send a local message.\n"),
141
142  OWLCMD_ARGS("zcrypt", owl_command_zcrypt, OWL_CTX_INTERACTIVE,
143              "send an encrypted zephyr",
144              "zcrypt [-n] [-C] [-c class] [-i instance] [-r realm] [-O opcde] [-m <message...>]\n",
145              "Behaves like zwrite but uses encryption.  Not for use with\n"
146              "personal messages\n"),
147 
148  OWLCMD_ARGS("reply", owl_command_reply,  OWL_CTX_INTERACTIVE,
149              "reply to the current message",
150              "reply [-e] [ sender | all | zaway ]",
151              "If -e is specified, the zwrite command line is presented to\n"
152              "allow editing.\n\n"
153              "If 'sender' is specified, reply to the sender.\n\n"
154              "If 'all' or no args are specified, reply publically to the\n"
155              "same class/instance for non-personal messages and to the\n"
156              "sender for personal messages.\n\n"
157              "If 'zaway' is specified, replies with a zaway message.\n\n"),
158
159  OWLCMD_ARGS("set", owl_command_set, OWL_CTX_ANY,
160              "set a variable value",
161              "set [-q] [<variable>] [<value>]\n"
162              "set",
163              "Set the named variable to the specified value.  If no\n"
164              "arguments are given, print the value of all variables.\n"
165              "If the value is unspecified and the variable is a boolean, it will be\n"
166              "set to 'on'.  If -q is used, set is silent and does not print a\n"
167              "message.\n"),
168
169  OWLCMD_ARGS("unset", owl_command_unset, OWL_CTX_ANY,
170              "unset a boolean variable value",
171              "set [-q] <variable>\n"
172              "set",
173              "Set the named boolean variable to off.\n"
174              "If -q is specified, is silent and doesn't print a message.\n"),
175
176  OWLCMD_ARGS("print", owl_command_print, OWL_CTX_ANY,
177              "print a variable value",
178              "print <variable>\n"
179              "print",
180              "Print the value of the named variable.  If no arugments\n"
181              "are used print the value of all variables.\n"),
182
183  OWLCMD_ARGS("startup", owl_command_startup, OWL_CTX_ANY,
184              "run a command and set it to be run at every Owl startup",
185              "startup <commands> ...",
186              "Everything on the command line after the startup command\n"
187              "is executed as a normal owl command and is also placed in\n"
188              "a file so that the command is executed every time owl\n"
189              "is started"),
190
191  OWLCMD_ARGS("unstartup", owl_command_unstartup, OWL_CTX_ANY,
192              "remove a command from the list of those to be run at Owl startup",
193              "unstartup <commands> ...",
194              ""),
195
196  OWLCMD_VOID("version", owl_command_version, OWL_CTX_ANY,
197              "print the version of the running owl", "", ""),
198
199  OWLCMD_ARGS("subscribe", owl_command_subscribe, OWL_CTX_ANY,
200              "subscribe to a zephyr class, instance, recipient",
201              "subscribe [-t] <class> <instance> [recipient]",
202              "Subscribe the specified class and instance.  If the recipient\n"
203              "is not listed on the command line it defaults\n"
204              "to * (the wildcard recipient).  If the -t option is present\n"
205              "the subscription will only be temporary, i.e., it will not\n"
206              "be written to the subscription file and will therefore not\n"
207              "be present the next time owl is started.\n"),
208  OWLCMD_ALIAS("sub", "subscribe"),
209
210  OWLCMD_ARGS("unsubscribe", owl_command_unsubscribe, OWL_CTX_ANY,
211              "unsubscribe from a zephyr class, instance, recipient",
212              "unsubscribe [-t] <class> <instance> [recipient]",
213              "Unsubscribe from the specified class and instance.  If the\n"
214              "recipient is not listed on the command line it defaults\n"
215              "to * (the wildcard recipient).  If the -t option is present\n"
216              "the unsubscription will only be temporary, i.e., it will not\n"
217              "be updated in the subscription file and will therefore not\n"
218              "be in effect the next time owl is started.\n"),
219  OWLCMD_ALIAS("unsub", "unsubscribe"),
220
221  OWLCMD_VOID("unsuball", owl_command_unsuball, OWL_CTX_ANY,
222              "unsubscribe from all zephyrs", "", ""),
223 
224  OWLCMD_VOID("getsubs", owl_command_getsubs, OWL_CTX_ANY,
225              "print all current subscriptions",
226              "getsubs",
227              "getsubs retrieves the current subscriptions from the server\n"
228              "and displays them.\n"),
229
230  OWLCMD_ARGS("dump", owl_command_dump, OWL_CTX_ANY,
231              "dump messages to a file",
232              "dump <filename>",
233              "Dump messages in current view to the named file."),
234
235  OWLCMD_ARGS("source", owl_command_source, OWL_CTX_ANY,
236              "execute owl commands from a file",
237              "source <filename>",
238              "Execute the owl commands in <filename>.\n"),
239
240  OWLCMD_ARGS("aim", owl_command_aim, OWL_CTX_INTERACTIVE,
241              "AIM specific commands",
242              "aim search <email>",
243              ""),
244
245  OWLCMD_ARGS("addbuddy", owl_command_addbuddy, OWL_CTX_INTERACTIVE,
246              "add a buddy to a buddylist",
247              "addbuddy aim <screenname>",
248              "Add the named buddy to your buddylist.  Eventually other protocols,\n"
249              "such as zephyr, will also be able to use this command.  For now the\n"
250              "only available protocol is 'aim', specified as the first argument."),
251
252  OWLCMD_ARGS("delbuddy", owl_command_delbuddy, OWL_CTX_INTERACTIVE,
253              "delete a buddy from a buddylist",
254              "delbuddy aim <screenname>",
255              "Delete the named buddy to your buddylist.  Eventually other protocols,\n"
256              "such as zephyr, will also be able to use this command.  For now the\n"
257              "only available protocol is 'aim', specified as the first argument.\n"),
258
259  OWLCMD_ARGS("join", owl_command_join, OWL_CTX_INTERACTIVE,
260              "join a chat group",
261              "join aim <groupname> [exchange]",
262              "Join the AIM chatroom with 'groupname'.\n"),
263
264  OWLCMD_ARGS("smartzpunt", owl_command_smartzpunt, OWL_CTX_INTERACTIVE,
265              "creates a zpunt based on the current message",
266              "smartzpunt [-i | --instance]",
267              "Starts a zpunt command based on the current message's class\n"
268              "(and instance if -i is specified).\n"),
269
270  OWLCMD_ARGS("zpunt", owl_command_zpunt, OWL_CTX_ANY,
271              "suppress a given zephyr triplet",
272              "zpunt <class> <instance> [recipient]\n"
273              "zpunt <instance>",
274              "The zpunt command will supress message to the specified\n"
275              "zephyr triplet.  In the second usage messages as supressed\n"
276              "for class MESSAGE and the named instance.\n\n"
277              "SEE ALSO:  zunpunt, show zpunts\n"),
278
279  OWLCMD_ARGS("zunpunt", owl_command_zunpunt, OWL_CTX_ANY,
280              "undo a previous zpunt",
281              "zunpunt <class> <instance> [recipient]\n"
282              "zunpunt <instance>",
283              "The zunpunt command will allow messages that were previosly\n"
284              "suppressed to be received again.\n\n"
285              "SEE ALSO:  zpunt, show zpunts\n"),
286
287  OWLCMD_VOID("info", owl_command_info, OWL_CTX_INTERACTIVE,
288              "display detailed information about the current message",
289              "", ""),
290 
291  OWLCMD_ARGS("help", owl_command_help, OWL_CTX_INTERACTIVE,
292              "display help on using owl",
293              "help [command]", ""),
294
295  OWLCMD_ARGS("zlist", owl_command_zlist, OWL_CTX_INTERACTIVE,
296              "List users logged in",
297              "znol [-f file]",
298              "Print a znol-style listing of users logged in"),
299
300  OWLCMD_ARGS("alist", owl_command_alist, OWL_CTX_INTERACTIVE,
301              "List AIM users logged in",
302              "alist",
303              "Print a listing of AIM users logged in"),
304
305  OWLCMD_ARGS("blist", owl_command_blist, OWL_CTX_INTERACTIVE,
306              "List all buddies logged in",
307              "blist",
308              "Print a listing of buddies logged in, regardless of protocol."),
309
310  OWLCMD_ARGS("toggle-oneline", owl_command_toggleoneline, OWL_CTX_INTERACTIVE,
311              "Toggle the style between oneline and the default style",
312              "toggle-oneline",
313              ""),
314
315  OWLCMD_VOID("recv:shiftleft", owl_command_shift_left, OWL_CTX_INTERACTIVE,
316              "scrolls receive window to the left", "", ""),
317
318  OWLCMD_VOID("recv:shiftright", owl_command_shift_right, OWL_CTX_INTERACTIVE,
319              "scrolls receive window to the left", "", ""),
320
321  OWLCMD_VOID("recv:pagedown", owl_function_mainwin_pagedown, 
322              OWL_CTX_INTERACTIVE,
323              "scrolls down by a page", "", ""),
324
325  OWLCMD_VOID("recv:pageup", owl_function_mainwin_pageup, OWL_CTX_INTERACTIVE,
326              "scrolls up by a page", "", ""),
327
328  OWLCMD_INT ("recv:scroll", owl_function_page_curmsg, OWL_CTX_INTERACTIVE,
329              "scrolls current message up or down", 
330              "recv:scroll <numlines>", 
331              "Scrolls the current message up or down by <numlines>.\n"
332              "Scrolls up if <numlines> is negative, else scrolls down.\n"),
333
334  OWLCMD_ARGS("next", owl_command_next, OWL_CTX_INTERACTIVE,
335              "move the pointer to the next message",
336              "recv:next [ --filter <name> ] [ --skip-deleted ] [ --last-if-none ]\n"
337              "          [ --smart-filter | --smart-filter-instance ]",
338              "Moves the pointer to the next message in the current view.\n"
339              "If --filter is specified, will only consider messages in\n"
340              "the filter <name>.\n"
341              "If --smart-filter or --smart-filter-instance is specified,\n"
342              "goes to the next message that is similar to the current message.\n"
343              "If --skip-deleted is specified, deleted messages will\n"
344              "be skipped.\n"
345              "If --last-if-none is specified, will stop at last message\n"
346              "in the view if no other suitable messages are found.\n"),
347  OWLCMD_ALIAS("recv:next", "next"),
348
349  OWLCMD_ARGS("prev", owl_command_prev, OWL_CTX_INTERACTIVE,
350              "move the pointer to the previous message",
351              "recv:prev [ --filter <name> ] [ --skip-deleted ] [ --first-if-none ]\n"
352              "          [ --smart-filter | --smart-filter-instance ]",
353              "Moves the pointer to the next message in the current view.\n"
354              "If --filter is specified, will only consider messages in\n"
355              "the filter <name>.\n"
356              "If --smart-filter or --smart-filter-instance is specified,\n"
357              "goes to the previous message that is similar to the current message.\n"
358              "If --skip-deleted is specified, deleted messages will\n"
359              "be skipped.\n"
360              "If --first-if-none is specified, will stop at first message\n"
361              "in the view if no other suitable messages are found.\n"),
362  OWLCMD_ALIAS("recv:prev", "prev"),
363
364  OWLCMD_ALIAS("recv:next-notdel", "recv:next --skip-deleted --last-if-none"),
365  OWLCMD_ALIAS("next-notdel",      "recv:next --skip-deleted --last-if-none"),
366
367  OWLCMD_ALIAS("recv:prev-notdel", "recv:prev --skip-deleted --first-if-none"),
368  OWLCMD_ALIAS("prev-notdel",      "recv:prev --skip-deleted --first-if-none"),
369
370  OWLCMD_ALIAS("recv:next-personal", "recv:next --filter personal"),
371
372  OWLCMD_ALIAS("recv:prev-personal", "recv:prev --filter personal"),
373
374  OWLCMD_VOID("first", owl_command_first, OWL_CTX_INTERACTIVE,
375              "move the pointer to the first message", "", ""),
376  OWLCMD_ALIAS("recv:first", "first"),
377
378  OWLCMD_VOID("last", owl_command_last, OWL_CTX_INTERACTIVE,
379              "move the pointer to the last message", "", 
380              "Moves the pointer to the last message in the view.\n"
381              "If we are already at the last message in the view,\n"
382              "blanks the screen and moves just past the end of the view\n"
383              "so that new messages will appear starting at the top\n"
384              "of the screen.\n"),
385  OWLCMD_ALIAS("recv:last", "last"),
386
387  OWLCMD_VOID("expunge", owl_command_expunge, OWL_CTX_INTERACTIVE,
388              "remove all messages marked for deletion", "", ""),
389
390  OWLCMD_VOID("resize", owl_command_resize, OWL_CTX_ANY,
391              "resize the window to the current screen size", "", ""),
392
393  OWLCMD_VOID("redisplay", owl_command_redisplay, OWL_CTX_ANY,
394              "redraw the entire window", "", ""),
395
396  OWLCMD_VOID("suspend", owl_command_suspend, OWL_CTX_ANY,
397              "suspend owl", "", ""),
398
399  OWLCMD_ARGS("echo", owl_command_echo, OWL_CTX_ANY,
400              "pops up a message in popup window",
401              "echo [args .. ]\n\n", ""),
402
403  OWLCMD_ARGS("exec", owl_command_exec, OWL_CTX_ANY,
404              "run a command from the shell",
405              "exec [args .. ]", ""),
406
407  OWLCMD_ARGS("aexec", owl_command_aexec, OWL_CTX_INTERACTIVE,
408              "run a command from the shell and display in an admin message",
409              "aexec [args .. ]", ""),
410
411  OWLCMD_ARGS("pexec", owl_command_pexec, OWL_CTX_INTERACTIVE,
412              "run a command from the shell and display in a popup window",
413              "pexec [args .. ]", ""),
414
415  OWLCMD_ARGS("perl", owl_command_perl, OWL_CTX_ANY,
416              "run a perl expression",
417              "perl [args .. ]", ""),
418
419  OWLCMD_ARGS("aperl", owl_command_aperl, OWL_CTX_INTERACTIVE,
420              "run a perl expression and display in an admin message",
421              "aperl [args .. ]", ""),
422
423  OWLCMD_ARGS("pperl", owl_command_pperl, OWL_CTX_INTERACTIVE,
424              "run a perl expression and display in a popup window",
425              "pperl [args .. ]", ""),
426
427  OWLCMD_ARGS("multi", owl_command_multi, OWL_CTX_ANY,
428              "runs multiple ;-separated commands",
429              "multi <command1> ( ; <command2> )*\n",
430              "Runs multiple semicolon-separated commands in order.\n"
431              "Note quoting isn't supported here yet.\n"
432              "If you want to do something fancy, use perl.\n"),
433
434  OWLCMD_ARGS("(", owl_command_multi, OWL_CTX_ANY,
435              "runs multiple ;-separated commands",
436              "'(' <command1> ( ; <command2> )* ')'\n",
437              "Runs multiple semicolon-separated commands in order.\n"
438              "You must have a space before the final ')'\n"
439              "Note quoting isn't supported here yet.\n"
440              "If you want to do something fancy, use perl.\n"),
441
442  OWLCMD_VOID("pop-message", owl_command_pop_message, OWL_CTX_RECWIN,
443              "pops up a message in a window", "", ""),
444
445  OWLCMD_VOID("openurl", owl_command_openurl, OWL_CTX_INTERACTIVE,
446              "opens up a URL from the current message",
447              "", 
448              "Uses the 'webbrowser' variable to determine\n"
449              "which browser to use.  Currently, 'netscape'\n"
450              "and 'galeon' are supported.\n"),
451
452  OWLCMD_ARGS("zaway", owl_command_zaway, OWL_CTX_INTERACTIVE,
453              "Set, enable or disable zephyr away message",
454              "zaway [ on | off | toggle ]\n"
455              "zaway <message>",
456              "Turn on or off a zaway message.  If 'message' is\n"
457              "specified turn on zaway with that message, otherwise\n"
458              "use the default.\n"),
459
460  OWLCMD_ARGS("aaway", owl_command_aaway, OWL_CTX_INTERACTIVE,
461              "Set, enable or disable AIM away message",
462              "aaway [ on | off | toggle ]\n"
463              "aaway <message>",
464              "Turn on or off the AIM away message.  If 'message' is\n"
465              "specified turn on aaway with that message, otherwise\n"
466              "use the default.\n"),
467
468  OWLCMD_ARGS("away", owl_command_away, OWL_CTX_INTERACTIVE,
469              "Set, enable or disable both AIM and zephyr away messages",
470              "away [ on | off | toggle ]\n"
471              "away <message>",
472              "Turn on or off the AIM and zephyr away message.  If\n"
473              "'message' is specified turn them on with that message,\n"
474              "otherwise use the default.\n"
475              "\n"
476              "This command really just runs the 'aaway' and 'zaway'\n"
477              "commands together\n"
478              "\n"
479              "SEE ALSO: aaway, zaway"),
480
481  OWLCMD_ARGS("load-subs", owl_command_loadsubs, OWL_CTX_ANY,
482              "load subscriptions from a file",
483              "load-subs <file>\n", ""),
484
485  OWLCMD_ARGS("loadsubs", owl_command_loadsubs, OWL_CTX_ANY,
486              "load subscriptions from a file",
487              "loadsubs <file>\n", ""),
488
489  OWLCMD_ARGS("loadloginsubs", owl_command_loadloginsubs, OWL_CTX_ANY,
490              "load login subscriptions from a file",
491              "loadloginsubs <file>\n",
492              "The file should contain a list of usernames, one per line."),
493
494  OWLCMD_VOID("about", owl_command_about, OWL_CTX_INTERACTIVE,
495              "print information about owl", "", ""),
496
497  OWLCMD_VOID("status", owl_command_status, OWL_CTX_ANY,
498              "print status information about the running owl", "", ""),
499 
500  OWLCMD_ARGS("zlocate", owl_command_zlocate, OWL_CTX_INTERACTIVE,
501              "locate a user",
502              "zlocate [-d] <user> ...", 
503              "Performs a zlocate on one ore more users and puts the result\n"
504              "int a popwin.  If -d is specified, does not authenticate\n"
505              "the lookup request.\n"),
506 
507  OWLCMD_ARGS("filter", owl_command_filter, OWL_CTX_ANY,
508              "create a message filter",
509              "filter <name> [ -c color ] [ <expression> ... ]",
510              "The filter command creates a filter with the specified name,\n"
511              "or if one already exists it is replaced.  Example filter\n"
512              "syntax would be:\n\n"
513              "     filter myfilter -c red ( class ^foobar$ ) or ( class ^quux$ and instance ^bar$ )\n\n"
514              "Valid matching fields are:\n"
515              "    sender     -  sender\n"
516              "    recipient  -  recipient\n"
517              "    class      -  zephyr class name\n"
518              "    instance   -  zephyr instance name\n"
519              "    opcode     -  zephyr opcode\n"
520              "    realm      -  zephyr realm\n"
521              "    body       -  message body\n"
522              "    hostname   -  hostname of sending host\n"
523              "    type       -  message type (zephyr, aim, admin)\n"
524              "    direction  -  either 'in' 'out' or 'none'\n"
525              "    login      -  either 'login' 'logout' or 'none'\n"
526              "Also you may match on the validity of another filter:\n"
527              "    filter <filtername>\n"
528              "Also you may pass the message to a perl function returning 0 or 1,\n"
529              "where 1 indicates that the function matches the filter:\n"
530              "    perl <subname>\n"
531              "Valid operators are:\n"
532              "    and\n"
533              "    or\n"
534              "    not\n"
535              "And additionally you may use the static values:\n"
536              "    true\n"
537              "    false\n"
538              "Spaces must be present before and after parenthesis.  If the\n"
539              "optional color argument is used it specifies the color that\n"
540              "messages matching this filter should be displayed in.\n\n"
541              "SEE ALSO: view, viewclass, viewuser\n"),
542
543  OWLCMD_ARGS("colorview", owl_command_colorview, OWL_CTX_INTERACTIVE,
544              "change the color on the current filter",
545              "colorview <color>",
546              "The color of messages in the current filter will be changed\n"
547              "to <color>.  Use the 'show colors' command for a list\n"
548              "of valid colors.\n\n"
549              "SEE ALSO: 'show colors'\n"),
550
551  OWLCMD_ARGS("colorclass", owl_command_colorclass, OWL_CTX_INTERACTIVE,
552              "create a filter to color messages of the given class name",
553              "colorclass <class> <color>",
554              "A filter will be created to color messages in <class>"
555              "in <color>.  Use the 'show colors' command for a list\n"
556              "of valid colors.\n\n"
557              "SEE ALSO: 'show colors'\n"),
558
559  OWLCMD_ARGS("view", owl_command_view, OWL_CTX_INTERACTIVE,
560              "view messages matching a filter",
561              "view [<viewname>] [-f <filter> | --home | -r ] [-s <style>]\n"
562              "view <filter>\n"
563              "view -d <expression>\n"
564              "view --home",
565              "The view command sets information associated with a particular view,\n"
566              "such as view's filter or style.  In the first general usage listed\n"
567              "above <viewname> is the name of the view to be changed.  If not\n"
568              "specified the default view 'main' will be used.  A filter can be set\n"
569              "for the view by listing a named filter after the -f argument.  If\n"
570              "the --home argument is used the filter will be set to the filter named\n"
571              "by the\n 'view_home' variable.  The style can be set by listing the\n"
572              "name style after the -s argument.\n"
573              "\n"
574              "The other usages listed above are abbreivated forms that simply set\n"
575              "the filter of the current view. The -d option allows you to write a\n"
576              "filter expression that will be dynamically created by owl and then\n"
577              "applied as the view's filter\n"
578              "SEE ALSO: filter, viewclass, viewuser\n"),
579
580  OWLCMD_ARGS("smartnarrow", owl_command_smartnarrow, OWL_CTX_INTERACTIVE,
581              "view only messages similar to the current message",
582              "smartnarrow [-i | --instance]",
583              "If the curmsg is a personal message narrow\n"
584              "   to the converstaion with that user.\n"
585              "If the curmsg is a class message, instance foo, recip *\n"
586              "   message, narrow to the class, inst.\n"
587              "If the curmsg is a class message then narrow\n"
588              "    to the class.\n"
589              "If the curmsg is a class message and '-i' is specied\n"
590              "    then narrow to the class, instance\n"),
591
592  OWLCMD_ARGS("smartfilter", owl_command_smartfilter, OWL_CTX_INTERACTIVE,
593              "returns the name of a filter based on the current message",
594              "smartfilter [-i | --instance]",
595              "If the curmsg is a personal message, the filter is\n"
596              "   the converstaion with that user.\n"
597              "If the curmsg is a class message, instance foo, recip *\n"
598              "   message, the filter is the class, inst.\n"
599              "If the curmsg is a class message, the filter is that class.\n"
600              "If the curmsg is a class message and '-i' is specied\n"
601              "    the filter is that <class,instance> pair\n"),
602
603  OWLCMD_ARGS("viewclass", owl_command_viewclass, OWL_CTX_INTERACTIVE,
604              "view messages matching a particular class",
605              "viewclass <class>",
606              "The viewclass command will automatically create a filter\n"
607              "matching the specified class and switch the current view\n"
608              "to it.\n\n"
609              "SEE ALSO: filter, view, viewuser\n"),
610  OWLCMD_ALIAS("vc", "viewclass"),
611
612  OWLCMD_ARGS("viewuser", owl_command_viewuser, OWL_CTX_INTERACTIVE,
613              "view messages matching a particular user",
614              "viewuser <user>",
615              "The viewuser command will automatically create a filter\n"
616              "matching the specified user and switch the current\n"
617              "view to it.\n\n"
618              "SEE ALSO: filter, view, viewclass\n"),
619  OWLCMD_ALIAS("vu", "viewuser"),
620
621  OWLCMD_ARGS("show", owl_command_show, OWL_CTX_INTERACTIVE,
622              "show information",
623              "show colors\n"
624              "show commands\n"
625              "show command <command>\n"
626              "show errors\n"
627              "show filters\n"
628              "show filter <filter>\n"
629              "show keymaps\n"
630              "show keymap <keymap>\n"
631              "show license\n"
632              "show startup\n"
633              "show status\n"
634              "show styles\n"
635              "show subscriptions / show subs\n"
636              "show terminal\n"
637              "show variables\n"
638              "show variable <variable>\n"
639              "show version\n"
640              "show view [<view>]\n"
641              "show zpunts\n",
642
643              "Show colors will display a list of valid colors for the\n"
644              "     terminal."
645              "Show filters will list the names of all filters.\n"
646              "Show filter <filter> will show the definition of a particular\n"
647              "     filter.\n\n"
648              "Show startup will display the custom startup config\n\n"
649              "Show zpunts will show the active zpunt filters.\n\n"
650              "Show keymaps will list the names of all keymaps.\n"
651              "Show keymap <keymap> will show the key bindings in a keymap.\n\n"
652              "Show commands will list the names of all keymaps.\n"
653              "Show command <command> will provide information about a command.\n\n"
654              "Show styles will list the names of all styles available\n"
655              "for formatting messages.\n\n"
656              "Show variables will list the names of all variables.\n\n"
657              "Show errors will show a list of errors ecountered by Owl.\n\n"
658              "SEE ALSO: filter, view, alias, bindkey, help\n"),
659 
660  OWLCMD_ARGS("delete", owl_command_delete, OWL_CTX_INTERACTIVE,
661              "mark a message for deletion",
662              "delete [ -id msgid ] [ --no-move ]\n"
663              "delete view\n"
664              "delete trash",
665              "If no message id is specified the current message is marked\n"
666              "for deletion.  Otherwise the message with the given message\n"
667              "id is marked for deltion.\n"
668              "If '--no-move' is specified, don't move after deletion.\n"
669              "If 'trash' is specified, deletes all trash/auto messages\n"
670              "in the current view.\n"
671              "If 'view' is specified, deletes all messages in the\n"
672              "current view.\n"),
673  OWLCMD_ALIAS("del", "delete"),
674
675  OWLCMD_ARGS("undelete", owl_command_undelete, OWL_CTX_INTERACTIVE,
676              "unmark a message for deletion",
677              "undelete [ -id msgid ] [ --no-move ]\n"
678              "undelete view",
679              "If no message id is specified the current message is\n"
680              "unmarked for deletion.  Otherwise the message with the\n"
681              "given message id is marked for undeltion.\n"
682              "If '--no-move' is specified, don't move after deletion.\n"
683              "If 'view' is specified, undeletes all messages\n"
684              "in the current view.\n"),
685  OWLCMD_ALIAS("undel", "undelete"),
686
687  OWLCMD_VOID("beep", owl_command_beep, OWL_CTX_ANY,
688              "ring the terminal bell",
689              "beep",
690              "Beep will ring the terminal bell.\n"
691              "If the variable 'bell' has been\n"
692              "set to 'off' this command does nothing.\n"),
693
694  OWLCMD_ARGS("debug", owl_command_debug, OWL_CTX_ANY,
695              "prints a message into the debug log",
696              "debug <message>", ""),
697
698  OWLCMD_ARGS("getview", owl_command_getview, OWL_CTX_INTERACTIVE,
699              "returns the name of the filter for the current view",
700              "", ""),
701
702  OWLCMD_ARGS("getvar", owl_command_getvar, OWL_CTX_INTERACTIVE,
703              "returns the value of a variable",
704              "getvar <varname>", ""),
705
706  OWLCMD_ARGS("getstyle", owl_command_getstyle, OWL_CTX_INTERACTIVE,
707              "returns the name of the style for the current view",
708              "", ""),
709
710  OWLCMD_ARGS("search", owl_command_search, OWL_CTX_INTERACTIVE,
711              "search messages for a particular string",
712              "search [-r] [<string>]",
713              "The search command will find messages that contain the\n"
714              "specified string and move the cursor there.  If no string\n"
715              "argument is supplied then the previous one is used.  By\n"
716              "default searches are done fowards, if -r is used the search\n"
717              "is performed backwards"),
718
719  OWLCMD_ARGS("aimlogin", owl_command_aimlogin, OWL_CTX_ANY,
720              "login to an AIM account",
721              "aimlogin <screenname> [<password>]\n",
722              ""),
723
724  OWLCMD_ARGS("aimlogout", owl_command_aimlogout, OWL_CTX_ANY,
725              "logout from AIM",
726              "aimlogout\n",
727              ""),
728
729  OWLCMD_ARGS("error", owl_command_error, OWL_CTX_ANY,
730              "Display an error message",
731              "error <message>",
732              ""),
733
734  OWLCMD_ARGS("message", owl_command_message, OWL_CTX_ANY,
735              "Display an informatative message",
736              "message <message>",
737              ""),
738
739  /****************************************************************/
740  /************************* EDIT-SPECIFIC ************************/
741  /****************************************************************/
742
743  OWLCMD_VOID_CTX("edit:move-next-word", owl_editwin_move_to_nextword, 
744                  OWL_CTX_EDIT,
745                  "moves cursor forward a word",
746                  "", ""),
747
748  OWLCMD_VOID_CTX("edit:move-prev-word", owl_editwin_move_to_previousword, 
749                  OWL_CTX_EDIT,
750                  "moves cursor backwards a word",
751                  "", ""),
752
753  OWLCMD_VOID_CTX("edit:move-to-buffer-start", owl_editwin_move_to_top,
754                  OWL_CTX_EDIT,
755                  "moves cursor to the top left (start) of the buffer",
756                  "", ""),
757
758  OWLCMD_VOID_CTX("edit:move-to-buffer-end", owl_editwin_move_to_end, 
759                  OWL_CTX_EDIT,
760                  "moves cursor to the bottom right (end) of the buffer",
761                  "", ""),
762
763  OWLCMD_VOID_CTX("edit:move-to-line-end", owl_editwin_move_to_line_end, 
764                  OWL_CTX_EDIT,
765                  "moves cursor to the end of the line",
766                  "", ""),
767
768  OWLCMD_VOID_CTX("edit:move-to-line-start", owl_editwin_move_to_line_start, 
769                  OWL_CTX_EDIT,
770                  "moves cursor to the beginning of the line",
771                  "", ""),
772
773  OWLCMD_VOID_CTX("edit:move-left", owl_editwin_key_left, 
774                  OWL_CTX_EDIT,
775                  "moves the cursor left by a character",
776                  "", ""),
777
778  OWLCMD_VOID_CTX("edit:move-right", owl_editwin_key_right,
779                  OWL_CTX_EDIT,
780                  "moves the cursor right by a character",
781                  "", ""),
782
783  OWLCMD_VOID_CTX("edit:delete-next-word", owl_editwin_delete_nextword,
784                  OWL_CTX_EDIT,
785                  "deletes the word to the right of the cursor",
786                  "", ""),
787
788  OWLCMD_VOID_CTX("edit:delete-prev-word", owl_editwin_delete_previousword,
789                  OWL_CTX_EDIT,
790                  "deletes the word to the left of the cursor",
791                  "", ""),
792
793  OWLCMD_VOID_CTX("edit:delete-prev-char", owl_editwin_backspace,
794                  OWL_CTX_EDIT,
795                  "deletes the character to the left of the cursor",
796                  "", ""),
797
798  OWLCMD_VOID_CTX("edit:delete-next-char", owl_editwin_delete_char, 
799                  OWL_CTX_EDIT,
800                  "deletes the character to the right of the cursor",
801                  "", ""),
802
803  OWLCMD_VOID_CTX("edit:delete-to-line-end", owl_editwin_delete_to_endofline,
804                  OWL_CTX_EDIT,
805                  "deletes from the cursor to the end of the line",
806                  "", ""),
807
808  OWLCMD_VOID_CTX("edit:delete-all", owl_editwin_clear, 
809                  OWL_CTX_EDIT,
810                  "deletes all of the contents of the buffer",
811                  "", ""),
812
813  OWLCMD_VOID_CTX("edit:transpose-chars", owl_editwin_transpose_chars,
814                  OWL_CTX_EDIT,
815                  "Interchange characters around point, moving forward one character.",
816                  "", ""),
817
818  OWLCMD_VOID_CTX("edit:fill-paragraph", owl_editwin_fill_paragraph, 
819                  OWL_CTX_EDIT,
820                  "fills the current paragraph to line-wrap well",
821                  "", ""),
822
823  OWLCMD_VOID_CTX("edit:recenter", owl_editwin_recenter, 
824                  OWL_CTX_EDIT,
825                  "recenters the buffer",
826                  "", ""),
827
828  OWLCMD_ARGS_CTX("edit:insert-text", owl_command_edit_insert_text, 
829                  OWL_CTX_EDIT,
830                  "inserts text into the buffer",
831                  "edit:insert-text <text>", ""),
832
833  OWLCMD_VOID_CTX("edit:cancel", owl_command_edit_cancel, 
834                  OWL_CTX_EDIT,
835                  "cancels the current command",
836                  "", ""),
837
838  OWLCMD_VOID_CTX("edit:history-next", owl_command_edit_history_next, 
839                  OWL_CTX_EDIT,
840                  "replaces the text with the previous history",
841                  "", ""),
842
843  OWLCMD_VOID_CTX("edit:history-prev", owl_command_edit_history_prev, 
844                  OWL_CTX_EDIT,
845                  "replaces the text with the previous history",
846                  "", ""),
847
848  OWLCMD_VOID_CTX("editline:done", owl_command_editline_done, 
849                  OWL_CTX_EDITLINE,
850                  "completes the command (eg, executes command being composed)",
851                  "", ""),
852
853  OWLCMD_VOID_CTX("editresponse:done", owl_command_editresponse_done, 
854                  OWL_CTX_EDITRESPONSE,
855                  "completes the response to a question",
856                  "", ""),
857
858  OWLCMD_VOID_CTX("editmulti:move-up-line", owl_editwin_key_up, 
859                  OWL_CTX_EDITMULTI,
860                  "moves the cursor up one line",
861                  "", ""),
862
863  OWLCMD_VOID_CTX("editmulti:move-down-line", owl_editwin_key_down, 
864                  OWL_CTX_EDITMULTI,
865                  "moves the cursor down one line",
866                  "", ""),
867
868  OWLCMD_VOID_CTX("editmulti:done", owl_command_editmulti_done, 
869                  OWL_CTX_EDITMULTI,
870                  "completes the command (eg, sends message being composed)",
871                  "", ""),
872
873  OWLCMD_VOID_CTX("editmulti:done-or-delete", owl_command_editmulti_done_or_delete, 
874                  OWL_CTX_EDITMULTI,
875                  "completes the command, but only if at end of message",
876                  "", 
877                  "If only whitespace is to the right of the cursor,\n"
878                  "runs 'editmulti:done'.\n"\
879                  "Otherwise runs 'edit:delete-next-char'\n"),
880
881  /****************************************************************/
882  /********************** POPLESS-SPECIFIC ************************/
883  /****************************************************************/
884
885  OWLCMD_VOID_CTX("popless:scroll-down-page", owl_viewwin_pagedown, 
886                  OWL_CTX_POPLESS,
887                  "scrolls down one page",
888                  "", ""),
889
890  OWLCMD_VOID_CTX("popless:scroll-down-line", owl_viewwin_linedown, 
891                  OWL_CTX_POPLESS,
892                  "scrolls down one line",
893                  "", ""),
894
895  OWLCMD_VOID_CTX("popless:scroll-up-page", owl_viewwin_pageup, 
896                  OWL_CTX_POPLESS,
897                  "scrolls up one page",
898                  "", ""),
899
900  OWLCMD_VOID_CTX("popless:scroll-up-line", owl_viewwin_lineup, 
901                  OWL_CTX_POPLESS,
902                  "scrolls up one line",
903                  "", ""),
904
905  OWLCMD_VOID_CTX("popless:scroll-to-top", owl_viewwin_top, 
906                  OWL_CTX_POPLESS,
907                  "scrolls to the top of the buffer",
908                  "", ""),
909
910  OWLCMD_VOID_CTX("popless:scroll-to-bottom", owl_viewwin_bottom, 
911                  OWL_CTX_POPLESS,
912                  "scrolls to the bottom of the buffer",
913                  "", ""),
914
915  OWLCMD_INT_CTX ("popless:scroll-right", owl_viewwin_right, 
916                  OWL_CTX_POPLESS,
917                  "scrolls right in the buffer",
918                  "popless:scroll-right <num-chars>", ""),
919
920  OWLCMD_INT_CTX ("popless:scroll-left", owl_viewwin_left, 
921                  OWL_CTX_POPLESS,
922                  "scrolls left in the buffer",
923                  "popless:scroll-left <num-chars>", ""),
924
925  OWLCMD_VOID_CTX("popless:quit", owl_command_popless_quit, 
926                  OWL_CTX_POPLESS,
927                  "exits the popless window",
928                  "", ""),
929
930  /* This line MUST be last! */
931  { NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
932
933};
934
935void owl_command_info()
936{
937  owl_function_info();
938}
939
940void owl_command_nop()
941{
942}
943
944char *owl_command_help(int argc, char **argv, char *buff)
945{
946  if (argc!=2) {
947    owl_help();
948    return NULL;
949  }
950 
951  owl_function_help_for_command(argv[1]);
952  return NULL;
953}
954
955char *owl_command_zlist(int argc, char **argv, char *buff)
956{
957  int elapsed=0, timesort=0;
958  char *file=NULL;
959
960  argc--;
961  argv++;
962  while (argc) {
963    if (!strcmp(argv[0], "-e")) {
964      elapsed=1;
965      argc--;
966      argv++;
967    } else if (!strcmp(argv[0], "-t")) {
968      timesort=1;
969      argc--;
970      argv++;
971    } else if (!strcmp(argv[0], "-f")) {
972      if (argc==1) {
973        owl_function_makemsg("zlist: -f needs an argument");
974        return(NULL);
975      }
976      file=argv[1];
977      argc-=2;
978      argv+=2;
979    } else {
980      owl_function_makemsg("zlist: unknown argument");
981      return(NULL);
982    }
983  }
984  owl_function_buddylist(0, 1, file);
985  return(NULL);
986}
987
988char *owl_command_alist()
989{
990  owl_function_buddylist(1, 0, NULL);
991  return(NULL);
992}
993
994char *owl_command_blist()
995{
996  owl_function_buddylist(1, 1, NULL);
997  return(NULL);
998}
999
1000char *owl_command_toggleoneline()
1001{
1002  owl_function_toggleoneline();
1003  return(NULL);
1004}
1005
1006void owl_command_about()
1007{
1008  owl_function_about();
1009}
1010
1011void owl_command_version()
1012{
1013  char buff[1024];
1014
1015  sprintf(buff, "Owl version %s", OWL_VERSION_STRING);
1016  owl_function_makemsg(buff);
1017}
1018
1019char *owl_command_aim(int argc, char **argv, char *buff)
1020{
1021  if (argc<2) {
1022    owl_function_makemsg("not enough arguments to aim command");
1023    return(NULL);
1024  }
1025
1026  if (!strcmp(argv[1], "search")) {
1027    if (argc!=3) {
1028      owl_function_makemsg("not enough arguments to aim search command");
1029      return(NULL);
1030    }
1031    owl_aim_search(argv[2]);
1032  } else {
1033    owl_function_makemsg("unknown subcommand '%s' for aim command", argv[1]);
1034    return(NULL);
1035  }
1036  return(NULL);
1037}
1038
1039char *owl_command_addbuddy(int argc, char **argv, char *buff)
1040{
1041  if (argc!=3) {
1042    owl_function_makemsg("usage: addbuddy <protocol> <buddyname>");
1043    return(NULL);
1044  }
1045
1046  if (!strcasecmp(argv[1], "aim")) {
1047    if (!owl_global_is_aimloggedin(&g)) {
1048      owl_function_makemsg("addbuddy: You must be logged into aim to use this command.");
1049      return(NULL);
1050    }
1051    /*
1052    owl_function_makemsg("This function is not yet operational.  Stay tuned.");
1053    return(NULL);
1054    */
1055    owl_aim_addbuddy(argv[2]);
1056    owl_function_makemsg("%s added as AIM buddy for %s", argv[2], owl_global_get_aim_screenname(&g));
1057  } else if (!strcasecmp(argv[1], "zephyr")) {
1058    owl_zephyr_addbuddy(argv[2]);
1059    owl_function_makemsg("%s added as zephyr buddy", argv[2]);
1060  } else {
1061    owl_function_makemsg("addbuddy: currently the only supported protocols are 'zephyr' and 'aim'");
1062  }
1063
1064  return(NULL);
1065}
1066
1067char *owl_command_delbuddy(int argc, char **argv, char *buff)
1068{
1069  if (argc!=3) {
1070    owl_function_makemsg("usage: delbuddy <protocol> <buddyname>");
1071    return(NULL);
1072  }
1073
1074  if (!strcasecmp(argv[1], "aim")) {
1075    if (!owl_global_is_aimloggedin(&g)) {
1076      owl_function_makemsg("delbuddy: You must be logged into aim to use this command.");
1077      return(NULL);
1078    }
1079    owl_aim_delbuddy(argv[2]);
1080    owl_function_makemsg("%s deleted as AIM buddy for %s", argv[2], owl_global_get_aim_screenname(&g));
1081  } else if (!strcasecmp(argv[1], "zephyr")) {
1082    owl_zephyr_delbuddy(argv[2]);
1083    owl_function_makemsg("%s deleted as zephyr buddy", argv[2]);
1084  } else {
1085    owl_function_makemsg("delbuddy: currently the only supported protocols are 'zephyr' and 'aim'");
1086  }
1087
1088  return(NULL);
1089}
1090
1091char *owl_command_join(int argc, char **argv, char *buff)
1092{
1093  if (argc!=3 && argc!=4) {
1094    owl_function_makemsg("usage: join <protocol> <buddyname> [exchange]");
1095    return(NULL);
1096  }
1097
1098  if (!strcasecmp(argv[1], "aim")) {
1099    if (!owl_global_is_aimloggedin(&g)) {
1100      owl_function_makemsg("join aim: You must be logged into aim to use this command.");
1101      return(NULL);
1102    }
1103    if (argc==3) {
1104      owl_aim_chat_join(argv[2], 4);
1105    } else {
1106      owl_aim_chat_join(argv[2], atoi(argv[3]));
1107    }
1108    /* owl_function_makemsg("%s deleted as AIM buddy for %s", argv[2], owl_global_get_aim_screenname(&g)); */
1109  } else {
1110    owl_function_makemsg("join: currently the only supported protocol is 'aim'");
1111  }
1112  return(NULL);
1113}
1114
1115char *owl_command_startup(int argc, char **argv, char *buff)
1116{
1117  char *ptr;
1118
1119  if (argc<2) {
1120    owl_function_makemsg("usage: %s <commands> ...", argv[0]);
1121    return(NULL);
1122  }
1123
1124  ptr=strchr(buff, ' ');
1125  if (!ptr) {
1126    owl_function_makemsg("Parse error finding command for startup");
1127    return(NULL);
1128  }
1129
1130  owl_function_command(ptr+1);
1131  owl_function_addstartup(ptr+1);
1132
1133  return(NULL);
1134}
1135
1136char *owl_command_unstartup(int argc, char **argv, char *buff)
1137{
1138  char *ptr;
1139
1140  if (argc<2) {
1141    owl_function_makemsg("usage: %s <commands> ...", argv[0]);
1142    return(NULL);
1143  }
1144
1145  ptr=strchr(buff, ' ');
1146  if (!ptr) {
1147    owl_function_makemsg("Parse error finding command for unstartup");
1148    return(NULL);
1149  }
1150
1151  owl_function_delstartup(ptr+1);
1152
1153  return(NULL);
1154}
1155
1156char *owl_command_dump(int argc, char **argv, char *buff)
1157{
1158  char *filename;
1159 
1160  if (argc!=2) {
1161    owl_function_makemsg("usage: dump <filename>");
1162    return(NULL);
1163  }
1164  filename=owl_util_makepath(argv[1]);
1165  owl_function_dump(filename);
1166  owl_free(filename);
1167  return(NULL);
1168}
1169
1170char *owl_command_source(int argc, char **argv, char *buff)
1171{
1172  if (argc!=2) {
1173    owl_function_makemsg("usage: source <filename>");
1174    return(NULL);
1175  }
1176
1177  owl_function_source(argv[1]);
1178  return(NULL);
1179}
1180
1181char *owl_command_next(int argc, char **argv, char *buff)
1182{
1183  char *filter=NULL;
1184  int skip_deleted=0, last_if_none=0;
1185  while (argc>1) {
1186    if (argc>=1 && !strcmp(argv[1], "--skip-deleted")) {
1187      skip_deleted=1;
1188      argc-=1; argv+=1; 
1189    } else if (argc>=1 && !strcmp(argv[1], "--last-if-none")) {
1190      last_if_none=1;
1191      argc-=1; argv+=1; 
1192    } else if (argc>=2 && !strcmp(argv[1], "--filter")) {
1193      filter = owl_strdup(argv[2]);
1194      argc-=2; argv+=2; 
1195    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter")) {
1196      filter = owl_function_smartfilter(0);
1197      argc-=2; argv+=2; 
1198    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter-instance")) {
1199      filter = owl_function_smartfilter(1);
1200      argc-=2; argv+=2; 
1201    } else {
1202      owl_function_makemsg("Invalid arguments to command 'next'.");
1203      return(NULL);
1204    }
1205  }
1206  owl_function_nextmsg_full(filter, skip_deleted, last_if_none);
1207  if (filter) owl_free(filter);
1208  return(NULL);
1209}
1210
1211char *owl_command_prev(int argc, char **argv, char *buff)
1212{
1213  char *filter=NULL;
1214  int skip_deleted=0, first_if_none=0;
1215  while (argc>1) {
1216    if (argc>=1 && !strcmp(argv[1], "--skip-deleted")) {
1217      skip_deleted=1;
1218      argc-=1; argv+=1; 
1219    } else if (argc>=1 && !strcmp(argv[1], "--first-if-none")) {
1220      first_if_none=1;
1221      argc-=1; argv+=1; 
1222    } else if (argc>=2 && !strcmp(argv[1], "--filter")) {
1223      filter = owl_strdup(argv[2]);
1224      argc-=2; argv+=2; 
1225    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter")) {
1226      filter = owl_function_smartfilter(0);
1227      argc-=2; argv+=2; 
1228    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter-instance")) {
1229      filter = owl_function_smartfilter(1);
1230      argc-=2; argv+=2; 
1231   } else {
1232      owl_function_makemsg("Invalid arguments to command 'prev'.");
1233      return(NULL);
1234    }
1235  }
1236  owl_function_prevmsg_full(filter, skip_deleted, first_if_none);
1237  if (filter) owl_free(filter);
1238  return(NULL);
1239}
1240
1241char *owl_command_smartnarrow(int argc, char **argv, char *buff)
1242{
1243  char *filtname = NULL;
1244
1245  if (argc == 1) {
1246    filtname = owl_function_smartfilter(0);
1247  } else if (argc == 2 && (!strcmp(argv[1], "-i") || !strcmp(argv[1], "--instance"))) {
1248    filtname = owl_function_smartfilter(1);
1249  } else {
1250    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);   
1251  }
1252  if (filtname) {
1253    owl_function_change_currentview_filter(filtname);
1254    owl_free(filtname);
1255  }
1256  return NULL;
1257}
1258
1259char *owl_command_smartfilter(int argc, char **argv, char *buff)
1260{
1261  char *filtname = NULL;
1262
1263  if (argc == 1) {
1264    filtname = owl_function_smartfilter(0);
1265  } else if (argc == 2 && (!strcmp(argv[1], "-i") || !strcmp(argv[1], "--instance"))) {
1266    filtname = owl_function_smartfilter(1);
1267  } else {
1268    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);   
1269  }
1270  return filtname;
1271}
1272
1273void owl_command_expunge()
1274{
1275  owl_function_expunge();
1276}
1277
1278void owl_command_first()
1279{
1280  owl_global_set_rightshift(&g, 0);
1281  owl_function_firstmsg();
1282}
1283
1284void owl_command_last()
1285{
1286  owl_function_lastmsg();
1287}
1288
1289void owl_command_resize()
1290{
1291  owl_function_resize();
1292}
1293
1294void owl_command_redisplay()
1295{
1296  owl_function_full_redisplay();
1297  owl_global_set_needrefresh(&g);
1298}
1299
1300void owl_command_shift_right()
1301{
1302  owl_function_shift_right();
1303}
1304
1305void owl_command_shift_left()
1306{
1307  owl_function_shift_left();
1308}
1309
1310void owl_command_unsuball()
1311{
1312  owl_function_unsuball();
1313}
1314
1315char *owl_command_loadsubs(int argc, char **argv, char *buff)
1316{
1317  if (argc == 2) {
1318    owl_function_loadsubs(argv[1]);
1319  } else if (argc == 1) {
1320    owl_function_loadsubs(NULL);
1321  } else {
1322    owl_function_makemsg("Wrong number of arguments for load-subs.");
1323    return(NULL);
1324  }
1325  return(NULL);
1326}
1327
1328
1329char *owl_command_loadloginsubs(int argc, char **argv, char *buff)
1330{
1331  if (argc == 2) {
1332    owl_function_loadloginsubs(argv[1]);
1333  } else if (argc == 1) {
1334    owl_function_loadloginsubs(NULL);
1335  } else {
1336    owl_function_makemsg("Wrong number of arguments for load-subs.");
1337    return(NULL);
1338  }
1339  return(NULL);
1340}
1341
1342void owl_command_suspend()
1343{
1344  owl_function_suspend();
1345}
1346
1347char *owl_command_start_command(int argc, char **argv, char *buff)
1348{
1349  buff = skiptokens(buff, 1);
1350  owl_function_start_command(buff);
1351  return(NULL);
1352}
1353
1354char *owl_command_start_question(int argc, char **argv, char *buff)
1355{
1356  buff = skiptokens(buff, 1);
1357  owl_function_start_question(buff);
1358  return(NULL);
1359}
1360
1361char *owl_command_start_password(int argc, char **argv, char *buff)
1362{
1363  buff = skiptokens(buff, 1);
1364  owl_function_start_password(buff);
1365  return(NULL);
1366}
1367
1368char *owl_command_zaway(int argc, char **argv, char *buff)
1369{
1370  if ((argc==1) ||
1371      ((argc==2) && !strcmp(argv[1], "on"))) {
1372    owl_global_set_zaway_msg(&g, owl_global_get_zaway_msg_default(&g));
1373    owl_function_zaway_on();
1374    return NULL;
1375  }
1376
1377  if (argc==2 && !strcmp(argv[1], "off")) {
1378    owl_function_zaway_off();
1379    return NULL;
1380  }
1381
1382  if (argc==2 && !strcmp(argv[1], "toggle")) {
1383    owl_function_zaway_toggle();
1384    return NULL;
1385  }
1386
1387  buff = skiptokens(buff, 1);
1388  owl_global_set_zaway_msg(&g, buff);
1389  owl_function_zaway_on();
1390  return NULL;
1391}
1392
1393
1394char *owl_command_aaway(int argc, char **argv, char *buff)
1395{
1396  if ((argc==1) ||
1397      ((argc==2) && !strcmp(argv[1], "on"))) {
1398    owl_global_set_aaway_msg(&g, owl_global_get_aaway_msg_default(&g));
1399    owl_function_aaway_on();
1400    return NULL;
1401  }
1402
1403  if (argc==2 && !strcmp(argv[1], "off")) {
1404    owl_function_aaway_off();
1405    return NULL;
1406  }
1407
1408  if (argc==2 && !strcmp(argv[1], "toggle")) {
1409    owl_function_aaway_toggle();
1410    return NULL;
1411  }
1412
1413  buff = skiptokens(buff, 1);
1414  owl_global_set_aaway_msg(&g, buff);
1415  owl_function_aaway_on();
1416  return NULL;
1417}
1418
1419
1420char *owl_command_away(int argc, char **argv, char *buff)
1421{
1422  if ((argc==1) ||
1423      ((argc==2) && !strcmp(argv[1], "on"))) {
1424    owl_global_set_aaway_msg(&g, owl_global_get_aaway_msg_default(&g));
1425    owl_global_set_zaway_msg(&g, owl_global_get_zaway_msg_default(&g));
1426    owl_function_aaway_on();
1427    owl_function_zaway_on();
1428    owl_function_makemsg("Away messages set.", owl_global_get_aaway_msg_default(&g));
1429    return NULL;
1430  }
1431
1432  if (argc==2 && !strcmp(argv[1], "off")) {
1433    owl_function_aaway_off();
1434    owl_function_zaway_off();
1435    return NULL;
1436  }
1437
1438  if (argc==2 && !strcmp(argv[1], "toggle")) {
1439    /* if either one is on, turn it off, otherwise toggle both (turn
1440     *  them both on)
1441     */
1442    if (!owl_global_is_zaway(&g) && !owl_global_is_aaway(&g)) {
1443      owl_function_aaway_toggle();
1444      owl_function_zaway_toggle();
1445      owl_function_makemsg("Away messages set.");
1446    } else {
1447      if (owl_global_is_zaway(&g)) owl_function_zaway_toggle();
1448      if (owl_global_is_aaway(&g)) owl_function_aaway_toggle();
1449      owl_function_makemsg("Away messages off.");
1450    }
1451    return NULL;
1452  }
1453
1454  buff = skiptokens(buff, 1);
1455  owl_global_set_aaway_msg(&g, buff);
1456  owl_global_set_zaway_msg(&g, buff);
1457  owl_function_aaway_on();
1458  owl_function_zaway_on();
1459  owl_function_makemsg("Away messages set.");
1460  return NULL;
1461}
1462
1463char *owl_command_set(int argc, char **argv, char *buff)
1464{
1465  char *var, *val;
1466  int  silent=0;
1467  int requirebool=0;
1468
1469  if (argc == 1) {
1470    owl_function_printallvars();
1471    return NULL;
1472  } 
1473
1474  if (argc > 1 && !strcmp("-q",argv[1])) {
1475    silent = 1;
1476    argc--; argv++;
1477  }
1478
1479  if (argc == 2) {
1480    var=argv[1];
1481    val="on";
1482    requirebool=1;
1483  } else if (argc == 3) {
1484    var=argv[1];
1485    val=argv[2];
1486  } else {
1487    owl_function_makemsg("Wrong number of arguments for set command");
1488    return NULL;
1489  }
1490  owl_variable_set_fromstring(owl_global_get_vardict(&g), var, val, !silent, requirebool);
1491  return NULL;
1492}
1493
1494char *owl_command_unset(int argc, char **argv, char *buff)
1495{
1496  char *var, *val;
1497  int  silent=0;
1498
1499  if (argc > 1 && !strcmp("-q",argv[1])) {
1500    silent = 1;
1501    argc--; argv++;
1502  }
1503  if (argc == 2) {
1504    var=argv[1];
1505    val="off";
1506  } else {
1507    owl_function_makemsg("Wrong number of arguments for unset command");
1508    return NULL;
1509  }
1510  owl_variable_set_fromstring(owl_global_get_vardict(&g), var, val, !silent, 1);
1511  return NULL;
1512}
1513
1514char *owl_command_print(int argc, char **argv, char *buff)
1515{
1516  char *var;
1517  char valbuff[1024];
1518
1519  if (argc==1) {
1520    owl_function_printallvars();
1521    return NULL;
1522  } else if (argc!=2) {
1523    owl_function_makemsg("Wrong number of arguments for print command");
1524    return NULL;
1525  }
1526
1527  var=argv[1];
1528   
1529  if (0 == owl_variable_get_tostring(owl_global_get_vardict(&g), 
1530                                     var, valbuff, 1024)) {
1531    owl_function_makemsg("%s = '%s'", var, valbuff);
1532  } else {
1533    owl_function_makemsg("Unknown variable '%s'.", var);
1534  }
1535  return NULL;
1536}
1537
1538
1539char *owl_command_exec(int argc, char **argv, char *buff)
1540{
1541  return owl_function_exec(argc, argv, buff, 0);
1542}
1543
1544char *owl_command_pexec(int argc, char **argv, char *buff)
1545{
1546  return owl_function_exec(argc, argv, buff, 1);
1547}
1548
1549char *owl_command_aexec(int argc, char **argv, char *buff)
1550{
1551  return owl_function_exec(argc, argv, buff, 2);
1552}
1553
1554char *owl_command_perl(int argc, char **argv, char *buff)
1555{
1556  return owl_function_perl(argc, argv, buff, 0);
1557}
1558
1559char *owl_command_pperl(int argc, char **argv, char *buff)
1560{
1561  return owl_function_perl(argc, argv, buff, 1);
1562}
1563
1564char *owl_command_aperl(int argc, char **argv, char *buff)
1565{
1566  return owl_function_perl(argc, argv, buff, 2);
1567}
1568
1569char *owl_command_multi(int argc, char **argv, char *buff)
1570{
1571  char *lastrv = NULL, *dupbuff, *newbuff;
1572  char **commands;
1573  int  ncommands, i;
1574  if (argc < 2) {
1575    owl_function_makemsg("Invalid arguments to 'multi' command.");   
1576    return NULL;
1577  }
1578  dupbuff = owl_strdup(buff);
1579  newbuff = skiptokens(dupbuff, 1);
1580  if (!strcmp(argv[0], "(")) {
1581    for (i=strlen(newbuff)-1; i>=0; i--) {
1582      if (newbuff[i] == ')') {
1583        newbuff[i] = '\0';
1584        break;
1585      } else if (newbuff[i] != ' ') {
1586        owl_function_makemsg("Invalid arguments to 'multi' command.");   
1587        owl_free(newbuff);
1588        return NULL;
1589      }
1590    }
1591  }
1592  commands = atokenize(newbuff, ";", &ncommands);
1593  for (i=0; i<ncommands; i++) {
1594    if (lastrv) {
1595      owl_free(lastrv);
1596    }
1597    lastrv = owl_function_command(commands[i]);
1598  }
1599  owl_free(dupbuff);
1600  atokenize_free(commands, ncommands);
1601  return lastrv;
1602}
1603
1604
1605char *owl_command_alias(int argc, char **argv, char *buff)
1606{
1607  if (argc < 3) {
1608    owl_function_makemsg("Invalid arguments to 'alias' command.");
1609    return NULL;
1610  }
1611  buff = skiptokens(buff, 2);
1612  owl_function_command_alias(argv[1], buff);
1613  return (NULL);
1614}
1615
1616
1617char *owl_command_bindkey(int argc, char **argv, char *buff)
1618{
1619  owl_keymap *km;
1620  int ret;
1621
1622  if (argc < 5 || strcmp(argv[3], "command")) {
1623    owl_function_makemsg("Usage: bindkey <keymap> <binding> command <cmd>");
1624    return NULL;
1625  }
1626  km = owl_keyhandler_get_keymap(owl_global_get_keyhandler(&g), argv[1]);
1627  if (!km) {
1628    owl_function_makemsg("No such keymap '%s'", argv[1]);
1629    return NULL;
1630  }
1631  buff = skiptokens(buff, 4);
1632  ret = owl_keymap_create_binding(km, argv[2], buff, NULL, "*user*");
1633  if (ret!=0) {
1634    owl_function_makemsg("Unable to bind '%s' in keymap '%s' to '%s'.",
1635                         argv[2], argv[1], buff);
1636    return NULL;
1637  }
1638  return NULL;
1639}
1640
1641char *owl_command_style(int argc, char **argv, char *buff) {
1642  owl_style *s;
1643
1644  /* Usage: style <name> perl <function> */
1645  if (argc != 4 || strcmp(argv[2], "perl")) {
1646    owl_function_makemsg("Usage: style <name> perl <function>");
1647    return NULL;
1648  }
1649  if (!owl_perlconfig_is_function(argv[3])) {
1650    owl_function_makemsg("Unable to create style '%s': no perl function '%s'",
1651                         argv[1], argv[3]);
1652    return NULL;
1653  }
1654  s=owl_malloc(sizeof(owl_style));
1655  owl_style_create_perl(s, argv[1], argv[3], NULL);
1656  owl_global_add_style(&g, s);
1657
1658  return NULL;
1659}
1660
1661
1662void owl_command_quit()
1663{
1664  owl_function_quit();
1665}
1666
1667char *owl_command_debug(int argc, char **argv, char *buff)
1668{
1669  if (argc<2) {
1670    owl_function_makemsg("Need at least one argument to debug command");
1671    return(NULL);
1672  }
1673
1674  if (!owl_global_is_debug_fast(&g)) {
1675    owl_function_makemsg("Debugging is not turned on");
1676    return(NULL);
1677  }
1678
1679  owl_function_debugmsg(argv[1]);
1680  return(NULL);
1681}
1682
1683char *owl_command_term(int argc, char **argv, char *buff)
1684{
1685  if (argc<2) {
1686    owl_function_makemsg("Need at least one argument to the term command");
1687    return(NULL);
1688  }
1689
1690  if (!strcmp(argv[1], "raise")) {
1691    owl_function_xterm_raise();
1692  } else if (!strcmp(argv[1], "deiconify")) {
1693    owl_function_xterm_deiconify();
1694  } else {
1695    owl_function_makemsg("Unknown terminal subcommand");
1696  }
1697  return(NULL);
1698}
1699
1700char *owl_command_zlog(int argc, char **argv, char *buff)
1701{
1702  if ((argc<2) || (argc>3)) {
1703    owl_function_makemsg("Wrong number of arguments for zlog command");
1704    return(NULL);
1705  }
1706
1707  if (!strcmp(argv[1], "in")) {
1708    if (argc>2) {
1709      owl_global_set_tty(&g, argv[2]);
1710    }
1711    owl_zephyr_zlog_in();
1712  } else if (!strcmp(argv[1], "out")) {
1713    if (argc!=2) {
1714      owl_function_makemsg("Wrong number of arguments for zlog command");
1715      return(NULL);
1716    }
1717    owl_zephyr_zlog_out();
1718  } else {
1719    owl_function_makemsg("Invalid subcommand for zlog");
1720  }
1721  return(NULL);
1722}
1723
1724
1725void owl_command_zlog_out(void)
1726{
1727  owl_zephyr_zlog_out();
1728}
1729
1730
1731char *owl_command_subscribe(int argc, char **argv, char *buff)
1732{
1733  char *recip="";
1734  int temp=0;
1735 
1736  if (argc<3) {
1737    owl_function_makemsg("Not enough arguments to the subscribe command");
1738    return(NULL);
1739  }
1740  argc--;
1741  argv++;
1742
1743  if (!strcmp(argv[0], "-t")) {
1744    temp=1;
1745    argc--;
1746    argv++;
1747  }
1748  if (argc<2) {
1749    owl_function_makemsg("Not enough arguments to the subscribe command");
1750    return(NULL);
1751  }
1752
1753  if (argc>3) {
1754    owl_function_makemsg("Too many arguments to the subscribe command");
1755    return(NULL);
1756  }
1757
1758  if (argc==2) {
1759    recip="";
1760  } else if (argc==3) {
1761    recip=argv[2];
1762  }
1763
1764  owl_function_subscribe(argv[0], argv[1], recip);
1765  if (!temp) {
1766    owl_zephyr_addsub(NULL, argv[0], argv[1], recip);
1767  }
1768  return(NULL);
1769}
1770
1771
1772char *owl_command_unsubscribe(int argc, char **argv, char *buff)
1773{
1774  char *recip="";
1775  int temp=0;
1776
1777  if (argc<3) {
1778    owl_function_makemsg("Not enough arguments to the unsubscribe command");
1779    return(NULL);
1780  }
1781  argc--;
1782  argv++;
1783
1784  if (!strcmp(argv[0], "-t")) {
1785    temp=1;
1786    argc--;
1787    argv++;
1788  }
1789  if (argc<2) {
1790    owl_function_makemsg("Not enough arguments to the subscribe command");
1791    return(NULL);
1792  }
1793
1794  if (argc>3) {
1795    owl_function_makemsg("Too many arguments to the unsubscribe command");
1796    return(NULL);
1797  }
1798
1799  if (argc==2) {
1800    recip="";
1801  } else if (argc==3) {
1802    recip=argv[2];
1803  }
1804
1805  owl_function_unsubscribe(argv[0], argv[1], recip);
1806  if (!temp) {
1807    owl_zephyr_delsub(NULL, argv[0], argv[1], recip);
1808  }
1809  return(NULL);
1810}
1811
1812char *owl_command_echo(int argc, char **argv, char *buff)
1813{
1814  buff = skiptokens(buff, 1);
1815  owl_function_popless_text(buff);
1816  return NULL;
1817}
1818
1819void owl_command_getsubs(void)
1820{
1821  owl_function_getsubs();
1822}
1823
1824void owl_command_status(void)
1825{
1826  owl_function_status();
1827}
1828
1829char *owl_command_zwrite(int argc, char **argv, char *buff)
1830{
1831  owl_zwrite z;
1832
1833  if (!owl_global_is_havezephyr(&g)) {
1834    owl_function_makemsg("Zephyr is not available");
1835    return(NULL);
1836  }
1837  /* check for a zwrite -m */
1838  owl_zwrite_create_from_line(&z, buff);
1839  if (owl_zwrite_is_message_set(&z)) {
1840    owl_function_zwrite(buff, NULL);
1841    owl_zwrite_free(&z);
1842    return (NULL);
1843  }
1844
1845  if (argc < 2) {
1846    owl_function_makemsg("Not enough arguments to the zwrite command.");
1847  } else {
1848    owl_function_zwrite_setup(buff);
1849  }
1850  return(NULL);
1851}
1852
1853char *owl_command_aimwrite(int argc, char **argv, char *buff)
1854{
1855  char *newbuff;
1856  int i, j;
1857 
1858  if (!owl_global_is_aimloggedin(&g)) {
1859    owl_function_makemsg("You are not logged in to AIM.");
1860    return(NULL);
1861  }
1862
1863  if (argc < 2) {
1864    owl_function_makemsg("Not enough arguments to the aimwrite command.");
1865    return(NULL);
1866  }
1867
1868  /* squish arguments together to make one screenname w/o spaces for now */
1869  newbuff=owl_malloc(strlen(buff)+5);
1870  sprintf(newbuff, "%s ", argv[0]);
1871  j=argc-1;
1872  for (i=0; i<j; i++) {
1873    strcat(newbuff, argv[i+1]);
1874  }
1875   
1876  owl_function_aimwrite_setup(newbuff);
1877  owl_free(newbuff);
1878  return(NULL);
1879}
1880
1881char *owl_command_loopwrite(int argc, char **argv, char *buff)
1882{
1883  owl_function_loopwrite_setup();
1884  return(NULL);
1885}
1886
1887char *owl_command_zcrypt(int argc, char **argv, char *buff)
1888{
1889#ifdef OWL_ENABLE_ZCRYPT
1890  owl_zwrite z;
1891
1892  if (!owl_global_is_havezephyr(&g)) {
1893    owl_function_makemsg("Zephyr is not available");
1894    return(NULL);
1895  }
1896  /* check for a zcrypt -m */
1897  owl_zwrite_create_from_line(&z, buff);
1898  if (owl_zwrite_is_message_set(&z)) {
1899    owl_function_zcrypt(buff, NULL);
1900    owl_zwrite_free(&z);
1901    return (NULL);
1902  }
1903
1904  if (argc < 2) {
1905    owl_function_makemsg("Not enough arguments to the zcrypt command.");
1906  } else {
1907    owl_function_zwrite_setup(buff);
1908  }
1909  return(NULL);
1910#else
1911  owl_function_makemsg("This Owl does not support zcrypt");
1912#endif
1913}
1914
1915char *owl_command_reply(int argc, char **argv, char *buff)
1916{
1917  int edit=0;
1918 
1919  if (argc>=2 && !strcmp("-e", argv[1])) {
1920    edit=1;
1921    argv++;
1922    argc--;
1923  }
1924
1925  if ((argc==1) || (argc==2 && !strcmp(argv[1], "all"))) {   
1926    owl_function_reply(0, !edit);
1927  } else if (argc==2 && !strcmp(argv[1], "sender")) {
1928    owl_function_reply(1, !edit);
1929  } else if (argc==2 && !strcmp(argv[1], "zaway")) {
1930    owl_message *m;
1931    owl_view    *v;
1932    v = owl_global_get_current_view(&g);   
1933    m = owl_view_get_element(v, owl_global_get_curmsg(&g));
1934    if (m) owl_zephyr_zaway(m);
1935  } else {
1936    owl_function_makemsg("Invalid arguments to the reply command.");
1937  }
1938  return NULL;
1939}
1940
1941char *owl_command_filter(int argc, char **argv, char *buff)
1942{
1943  owl_function_create_filter(argc, argv);
1944  return NULL;
1945}
1946
1947char *owl_command_zlocate(int argc, char **argv, char *buff)
1948{
1949  int auth;
1950 
1951  if (argc<2) {
1952    owl_function_makemsg("Too few arguments for zlocate command");
1953    return NULL;
1954  }
1955
1956  auth=1;
1957  if (!strcmp(argv[1], "-d")) {
1958    if (argc>2) {
1959      auth=0;
1960      argc--;
1961      argv++;
1962    } else {
1963      owl_function_makemsg("Missing arguments for zlocate command");
1964      return NULL;
1965    }
1966  }
1967
1968  argc--;
1969  argv++;
1970  owl_function_zlocate(argc, argv, auth);
1971  return NULL;
1972}
1973
1974
1975/* Backwards compatability has made this kind of complicated:
1976 * view [<viewname>] [-f <filter> | -d <expression> | --home | -r ] [-s <style>]
1977 * view <filter>
1978 * view -d <expression>
1979 * view --home
1980 */
1981char *owl_command_view(int argc, char **argv, char *buff)
1982{
1983  /* First take the 'view --home' and 'view -r' cases */
1984  if (argc == 2) {
1985    if (!strcmp(argv[1], "--home")) {
1986      owl_function_change_currentview_filter(owl_global_get_view_home(&g));
1987      return(NULL);
1988    } else if (!strcmp(argv[1], "-r")) {
1989      char *foo;
1990      foo=owl_function_create_negative_filter(owl_view_get_filtname(owl_global_get_current_view(&g)));
1991      owl_function_change_currentview_filter(foo);
1992      owl_free(foo);
1993      return(NULL);
1994    }
1995  }
1996
1997  /* Now look for 'view <filter>' */
1998  if (argc==2) {
1999    owl_function_change_currentview_filter(argv[1]);
2000    return(NULL);
2001  }
2002
2003  /* Now get 'view -d <expression>' */
2004  if (argc>=3 && !strcmp(argv[1], "-d")) {
2005    char **myargv;
2006    int i;
2007
2008    myargv=owl_malloc((argc*sizeof(char *))+50);
2009    myargv[0]="";
2010    myargv[1]="owl-dynamic";
2011    for (i=2; i<argc; i++) {
2012      myargv[i]=argv[i];
2013    }
2014    owl_function_create_filter(argc, myargv);
2015    owl_function_change_currentview_filter("owl-dynamic");
2016    owl_free(myargv);
2017    return NULL;
2018  }
2019
2020  /* Finally handle the general case */
2021  if (argc<3) {
2022    owl_function_makemsg("Too few arguments to the view command.");
2023    return(NULL);
2024  }
2025  argc--;
2026  argv++;
2027  if (strcmp(argv[0], "-f") &&
2028      strcmp(argv[0], "-d") &&
2029      strcmp(argv[0], "--home") &&
2030      strcmp(argv[0], "-s") &&
2031      strcmp(argv[0], "-r")) {
2032    if (strcmp(argv[0], "main")) {
2033      owl_function_makemsg("No view named '%s'", argv[0]);
2034      return(NULL);
2035    }
2036    argc--;
2037    argv++;
2038  }
2039  while (argc) {
2040    if (!strcmp(argv[0], "-f")) {
2041      if (argc<2) {
2042        owl_function_makemsg("Too few argments to the view command");
2043        return(NULL);
2044      }
2045      owl_function_change_currentview_filter(argv[1]);
2046      argc-=2;
2047      argv+=2;
2048    } else if (!strcmp(argv[0], "--home")) {
2049      owl_function_change_currentview_filter(owl_global_get_view_home(&g));
2050      argc--;
2051      argv++;
2052    } else if (!strcmp(argv[0], "-r")) {
2053      char *foo;
2054      foo=owl_function_create_negative_filter(owl_view_get_filtname(owl_global_get_current_view(&g)));
2055      owl_function_change_currentview_filter(foo);
2056    } else if (!strcmp(argv[0], "-s")) {
2057      if (argc<2) {
2058        owl_function_makemsg("Too few argments to the view command");
2059        return(NULL);
2060      }
2061      owl_function_change_style(owl_global_get_current_view(&g), argv[1]);
2062      argc-=2;
2063      argv+=2;
2064    } else {
2065      owl_function_makemsg("Too few argments to the view command");
2066      return(NULL);
2067    }
2068   
2069  }
2070  return(NULL);
2071}
2072
2073char *owl_command_show(int argc, char **argv, char *buff)
2074{
2075  if (argc<2) {
2076    owl_function_help_for_command("show");
2077    return NULL;
2078  }
2079
2080  if (!strcmp(argv[1], "filter") || !strcmp(argv[1], "filters")) {
2081    if (argc==2) {
2082      owl_function_show_filters();
2083    } else {
2084      owl_function_show_filter(argv[2]);
2085    }
2086  } else if (argc==2 
2087             && (!strcmp(argv[1], "zpunts") || !strcmp(argv[1], "zpunted"))) {
2088    owl_function_show_zpunts();
2089  } else if (!strcmp(argv[1], "command") || !strcmp(argv[1], "commands")) {
2090    if (argc==2) {
2091      owl_function_show_commands();
2092    } else {
2093      owl_function_show_command(argv[2]);
2094    }
2095  } else if (!strcmp(argv[1], "variable") || !strcmp(argv[1], "variables")) {
2096    if (argc==2) {
2097      owl_function_show_variables();
2098    } else {
2099      owl_function_show_variable(argv[2]);
2100    }
2101  } else if (!strcmp(argv[1], "keymap") || !strcmp(argv[1], "keymaps")) {
2102    if (argc==2) {
2103      owl_function_show_keymaps();
2104    } else {
2105      owl_function_show_keymap(argv[2]);
2106    }
2107  } else if (!strcmp(argv[1], "view")) {
2108    if (argc==3) {
2109      owl_function_show_view(argv[2]);
2110    } else {
2111      owl_function_show_view(NULL);
2112    }
2113  } else if (!strcmp(argv[1], "colors")) {
2114    owl_function_show_colors();
2115  } else if (!strcmp(argv[1], "styles")) {
2116    owl_function_show_styles();
2117  } else if (!strcmp(argv[1], "subs") || !strcmp(argv[1], "subscriptions")) {
2118    owl_function_getsubs();
2119  } else if (!strcmp(argv[1], "terminal") || !strcmp(argv[1], "term")) {
2120    owl_function_show_term();
2121  } else if (!strcmp(argv[1], "version")) {
2122    owl_function_about();
2123  } else if (!strcmp(argv[1], "status")) {
2124    owl_function_status();
2125  } else if (!strcmp(argv[1], "license")) {
2126    owl_function_show_license();
2127  } else if (!strcmp(argv[1], "startup")) {
2128    char *filename;
2129   
2130    filename=owl_sprintf("%s/%s", owl_global_get_homedir(&g), OWL_STARTUP_FILE);
2131    owl_function_popless_file(filename);
2132    owl_free(filename);
2133  } else if (!strcmp(argv[1], "errors")) {
2134    owl_function_showerrs();
2135  } else {
2136    owl_function_makemsg("Unknown subcommand for 'show' command (see 'help show' for allowed args)");
2137    return NULL;
2138  }
2139  return NULL;
2140}
2141
2142char *owl_command_viewclass(int argc, char **argv, char *buff)
2143{
2144  char *filtname;
2145  if (argc!=2) {
2146    owl_function_makemsg("Wrong number of arguments to viewclass command");
2147    return NULL;
2148  }
2149  filtname = owl_function_classinstfilt(argv[1], NULL);
2150  owl_function_change_currentview_filter(filtname);
2151  owl_free(filtname);
2152  return NULL;
2153}
2154
2155char *owl_command_viewuser(int argc, char **argv, char *buff)
2156{
2157  char *filtname;
2158  if (argc!=2) {
2159    owl_function_makemsg("Wrong number of arguments to viewuser command");
2160    return NULL;
2161  }
2162  filtname=owl_function_zuserfilt(argv[1]);
2163  owl_function_change_currentview_filter(filtname);
2164  owl_free(filtname);
2165  return NULL;
2166}
2167
2168
2169void owl_command_pop_message(void)
2170{
2171  owl_function_curmsg_to_popwin();
2172}
2173
2174void owl_command_openurl(void)
2175{
2176  owl_function_openurl();
2177}
2178
2179char *owl_command_delete(int argc, char **argv, char *buff)
2180{
2181  int move_after = 1;
2182
2183  if (argc>1 && !strcmp(argv[1], "--no-move")) {
2184    move_after = 0;
2185    argc--; 
2186    argv++;
2187  }
2188
2189  if (argc==1) {
2190    owl_function_deletecur(move_after);
2191    return NULL;
2192  }
2193
2194  if (argc==2 && !strcmp(argv[1], "view")) {
2195    owl_function_delete_curview_msgs(1);
2196    return NULL;
2197  }
2198
2199  if (argc==2 && !strcmp(argv[1], "trash")) {
2200    owl_function_delete_automsgs();
2201    return NULL;
2202  }
2203
2204  if (argc==3 && (!strcmp(argv[1], "-id") || !strcmp(argv[1], "--id"))) {
2205    owl_function_delete_by_id(atoi(argv[2]), 1);
2206    return NULL;
2207  }
2208
2209  owl_function_makemsg("Unknown arguments to delete command");
2210  return NULL;
2211}
2212
2213char *owl_command_undelete(int argc, char **argv, char *buff)
2214{
2215  int move_after = 1;
2216
2217  if (argc>1 && !strcmp(argv[1], "--no-move")) {
2218    move_after = 0;
2219    argc--; 
2220    argv++;
2221  }
2222
2223  if (argc==1) {
2224    owl_function_undeletecur(move_after);
2225    return NULL;
2226  }
2227
2228  if (argc==2 && !strcmp(argv[1], "view")) {
2229    owl_function_delete_curview_msgs(0);
2230    return NULL;
2231  }
2232
2233  if (argc==3 && (!strcmp(argv[1], "-id") || !strcmp(argv[1], "--id"))) {
2234    owl_function_delete_by_id(atoi(argv[2]), 0);
2235    return NULL;
2236  }
2237
2238  owl_function_makemsg("Unknown arguments to delete command");
2239  return NULL;
2240}
2241
2242void owl_command_beep()
2243{
2244  owl_function_beep();
2245}
2246
2247char *owl_command_colorview(int argc, char **argv, char *buff)
2248{
2249  if (argc!=2) {
2250    owl_function_makemsg("Wrong number of arguments to colorview command");
2251    return NULL;
2252  }
2253  owl_function_color_current_filter(argv[1]);
2254  return NULL;
2255}
2256
2257char *owl_command_colorclass(int argc, char **argv, char *buff)
2258{
2259  char *filtname;
2260 
2261  if (argc!=3) {
2262    owl_function_makemsg("Wrong number of arguments to colorclass command");
2263    return NULL;
2264  }
2265
2266  filtname=owl_function_classinstfilt(argv[1], NULL);
2267  (void) owl_function_color_filter(filtname, argv[2]);
2268  return NULL;
2269}
2270
2271char *owl_command_zpunt(int argc, char **argv, char *buff)
2272{
2273  owl_command_zpunt_and_zunpunt(argc, argv, 0);
2274  return NULL;
2275}
2276
2277char *owl_command_zunpunt(int argc, char **argv, char *buff)
2278{
2279  owl_command_zpunt_and_zunpunt(argc, argv, 1);
2280  return NULL;
2281}
2282
2283
2284void owl_command_zpunt_and_zunpunt(int argc, char **argv, int type)
2285{
2286  /* if type==0 then zpunt
2287   * if type==1 then zunpunt
2288   */
2289  char *class, *inst, *recip;
2290
2291  class="message";
2292  inst="";
2293  recip="*";
2294
2295  if (argc==1) {
2296    /* show current punt filters */
2297    owl_function_show_zpunts();
2298    return;
2299  } else if (argc==2) {
2300    inst=argv[1];
2301  } else if (argc==3) {
2302    class=argv[1];
2303    inst=argv[2];
2304  } else if (argc==4) {
2305    class=argv[1];
2306    inst=argv[2];
2307    recip=argv[3];
2308  } else {
2309    owl_function_makemsg("Wrong number of arguments to the zpunt command");
2310    return;
2311  }
2312
2313  owl_function_zpunt(class, inst, recip, type);
2314  if (type==0) {
2315    owl_function_makemsg("<%s, %s, %s> added to punt list.", class, inst, recip);
2316  } else if (type==1) {
2317    owl_function_makemsg("<%s, %s, %s> removed from punt list.", class, inst, recip);
2318  }
2319}
2320
2321char *owl_command_smartzpunt(int argc, char **argv, char *buff)
2322{
2323  if (argc == 1) {
2324    owl_function_smartzpunt(0);
2325  } else if (argc == 2 && (!strcmp(argv[1], "-i") || !strcmp(argv[1], "--instance"))) {
2326    owl_function_smartzpunt(1);
2327  } else {
2328    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);   
2329  }
2330  return NULL;
2331}
2332
2333char *owl_command_getview(int argc, char **argv, char *buff)
2334{
2335  char *filtname;
2336  if (argc != 1) {
2337    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);
2338    return NULL;
2339  }
2340  filtname = owl_view_get_filtname(owl_global_get_current_view(&g));
2341  if (filtname) filtname = owl_strdup(filtname);
2342  return filtname;
2343}
2344
2345char *owl_command_getvar(int argc, char **argv, char *buff)
2346{
2347  char tmpbuff[1024];
2348  if (argc != 2) {
2349    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);
2350    return NULL;
2351  }
2352  if (owl_variable_get_tostring(owl_global_get_vardict(&g), 
2353                                argv[1], tmpbuff, 1024)) {
2354    return NULL;
2355  }
2356  return owl_strdup(tmpbuff); 
2357}
2358
2359char *owl_command_search(int argc, char **argv, char *buff)
2360{
2361  int direction;
2362  char *buffstart;
2363
2364  direction=OWL_DIRECTION_DOWNWARDS;
2365  buffstart=skiptokens(buff, 1);
2366  if (argc>1 && !strcmp(argv[1], "-r")) {
2367    direction=OWL_DIRECTION_UPWARDS;
2368    buffstart=skiptokens(buff, 2);
2369  }
2370   
2371  if (argc==1 || (argc==2 && !strcmp(argv[1], "-r"))) {
2372    owl_function_search_continue(direction);
2373  } else {
2374    owl_function_search_start(buffstart, direction);
2375  }
2376 
2377  return(NULL);
2378}
2379
2380char *owl_command_aimlogin(int argc, char **argv, char *buff)
2381{
2382  if ((argc<2) || (argc>3)) {
2383    owl_function_makemsg("Wrong number of arguments to aimlogin command");
2384    return(NULL);
2385  }
2386
2387  /* if we get two arguments, ask for the password */
2388  if (argc==2) {
2389    owl_global_set_buffercommand(&g, argv[1]);
2390    owl_global_set_buffercallback(&g, &owl_callback_aimlogin);
2391    owl_function_start_password("AIM Password: ");
2392    return(NULL);
2393  } else {
2394    owl_function_aimlogin(argv[1], argv[2]);
2395  }
2396
2397  /* this is a test */
2398  return(NULL);
2399}
2400
2401char *owl_command_aimlogout(int argc, char **argv, char *buff)
2402{
2403  /* clear the buddylist */
2404  owl_buddylist_clear(owl_global_get_buddylist(&g));
2405
2406  owl_aim_logout();
2407  return(NULL);
2408}
2409
2410char *owl_command_getstyle(int argc, char **argv, char *buff)
2411{
2412  char *stylename;
2413  if (argc != 1) {
2414    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);
2415    return NULL;
2416  }
2417  stylename = owl_view_get_style_name(owl_global_get_current_view(&g));
2418  if (stylename) stylename = owl_strdup(stylename);
2419  return stylename;
2420}
2421
2422char *owl_command_error(int argc, char **argv, char *buff)
2423{
2424    buff = skiptokens(buff, 1);
2425    owl_function_error(buff);
2426    return NULL;
2427}
2428
2429char *owl_command_message(int argc, char **argv, char *buff)
2430{
2431    buff = skiptokens(buff, 1);
2432    owl_function_makemsg(buff);
2433    return NULL;
2434}
2435
2436/*********************************************************************/
2437/************************** EDIT SPECIFIC ****************************/
2438/*********************************************************************/
2439
2440void owl_command_edit_cancel(owl_editwin *e)
2441{
2442  owl_history *hist;
2443
2444  owl_function_makemsg("Command cancelled.");
2445
2446  hist=owl_editwin_get_history(e);
2447  owl_history_store(hist, owl_editwin_get_text(e));
2448  owl_history_reset(hist);
2449
2450  owl_editwin_fullclear(e);
2451  owl_global_set_needrefresh(&g);
2452  wnoutrefresh(owl_editwin_get_curswin(e));
2453  owl_global_set_typwin_inactive(&g);
2454  owl_editwin_new_style(e, OWL_EDITWIN_STYLE_ONELINE, NULL);
2455
2456  owl_function_activate_keymap("recv");
2457}
2458
2459void owl_command_edit_history_prev(owl_editwin *e)
2460{
2461  owl_history *hist;
2462  char *ptr;
2463
2464  hist=owl_editwin_get_history(e);
2465  if (!owl_history_is_touched(hist)) {
2466    owl_history_store(hist, owl_editwin_get_text(e));
2467    owl_history_set_partial(hist);
2468  }
2469  ptr=owl_history_get_prev(hist);
2470  if (ptr) {
2471    owl_editwin_clear(e);
2472    owl_editwin_insert_string(e, ptr);
2473    owl_editwin_redisplay(e, 0);
2474    owl_global_set_needrefresh(&g);
2475  } else {
2476    owl_function_beep();
2477  }
2478}
2479
2480void owl_command_edit_history_next(owl_editwin *e)
2481{
2482  owl_history *hist;
2483  char *ptr;
2484
2485  hist=owl_editwin_get_history(e);
2486  ptr=owl_history_get_next(hist);
2487  if (ptr) {
2488    owl_editwin_clear(e);
2489    owl_editwin_insert_string(e, ptr);
2490    owl_editwin_redisplay(e, 0);
2491    owl_global_set_needrefresh(&g);
2492  } else {
2493    owl_function_beep();
2494  }
2495}
2496
2497char *owl_command_edit_insert_text(owl_editwin *e, int argc, char **argv, char *buff)
2498{
2499  buff = skiptokens(buff, 1);
2500  owl_editwin_insert_string(e, buff);
2501  owl_editwin_redisplay(e, 0);
2502  owl_global_set_needrefresh(&g); 
2503  return NULL;
2504}
2505
2506void owl_command_editline_done(owl_editwin *e)
2507{
2508  owl_history *hist=owl_editwin_get_history(e);
2509  char *rv, *cmd;
2510
2511  owl_history_store(hist, owl_editwin_get_text(e));
2512  owl_history_reset(hist);
2513  owl_global_set_typwin_inactive(&g);
2514  cmd = owl_strdup(owl_editwin_get_text(e));
2515  owl_editwin_fullclear(e);
2516  rv = owl_function_command(cmd);
2517  owl_free(cmd);
2518
2519  wnoutrefresh(owl_editwin_get_curswin(e));
2520  owl_global_set_needrefresh(&g);
2521
2522  if (rv) {
2523    owl_function_makemsg("%s", rv);
2524    owl_free(rv);
2525  }
2526}
2527
2528
2529void owl_command_editresponse_done(owl_editwin *e)
2530{
2531  owl_function_run_buffercommand();
2532
2533  owl_global_set_typwin_inactive(&g);
2534  owl_editwin_fullclear(e);
2535  wnoutrefresh(owl_editwin_get_curswin(e));
2536  owl_global_set_needrefresh(&g);
2537}
2538
2539
2540void owl_command_editmulti_done(owl_editwin *e)
2541{
2542  owl_history *hist=owl_editwin_get_history(e);
2543
2544  owl_history_store(hist, owl_editwin_get_text(e));
2545  owl_history_reset(hist);
2546
2547  owl_function_run_buffercommand();
2548  owl_editwin_new_style(e, OWL_EDITWIN_STYLE_ONELINE, NULL);
2549  owl_editwin_fullclear(e);
2550  owl_global_set_typwin_inactive(&g);
2551  owl_global_set_needrefresh(&g);
2552  wnoutrefresh(owl_editwin_get_curswin(e));
2553}
2554
2555void owl_command_editmulti_done_or_delete(owl_editwin *e)
2556{
2557  if (owl_editwin_is_at_end(e)) {
2558    owl_command_editmulti_done(e);
2559  } else {
2560    owl_editwin_delete_char(e);
2561  }
2562}
2563
2564
2565/*********************************************************************/
2566/*********************** POPLESS SPECIFIC ****************************/
2567/*********************************************************************/
2568
2569void owl_command_popless_quit(owl_viewwin *vw)
2570{
2571  owl_popwin_close(owl_global_get_popwin(&g));
2572  owl_viewwin_free(vw);
2573  owl_global_set_needrefresh(&g);
2574}
Note: See TracBrowser for help on using the repository browser.