source: commands.c @ 46e8a1e

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