source: commands.c @ 1b6b2f3

barnowl_perlaimdebianrelease-1.10release-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since 1b6b2f3 was 1b6b2f3, checked in by Nelson Elhage <nelhage@mit.edu>, 17 years ago
Refactoring the editwin code somewhat, and adding the ability to hang arbitrary reply commands off of messages.
  • Property mode set to 100644
File size: 74.3 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
730  /****************************************************************/
731  /************************* EDIT-SPECIFIC ************************/
732  /****************************************************************/
733
734  OWLCMD_VOID_CTX("edit:move-next-word", owl_editwin_move_to_nextword, 
735                  OWL_CTX_EDIT,
736                  "moves cursor forward a word",
737                  "", ""),
738
739  OWLCMD_VOID_CTX("edit:move-prev-word", owl_editwin_move_to_previousword, 
740                  OWL_CTX_EDIT,
741                  "moves cursor backwards a word",
742                  "", ""),
743
744  OWLCMD_VOID_CTX("edit:move-to-buffer-start", owl_editwin_move_to_top,
745                  OWL_CTX_EDIT,
746                  "moves cursor to the top left (start) of the buffer",
747                  "", ""),
748
749  OWLCMD_VOID_CTX("edit:move-to-buffer-end", owl_editwin_move_to_end, 
750                  OWL_CTX_EDIT,
751                  "moves cursor to the bottom right (end) of the buffer",
752                  "", ""),
753
754  OWLCMD_VOID_CTX("edit:move-to-line-end", owl_editwin_move_to_line_end, 
755                  OWL_CTX_EDIT,
756                  "moves cursor to the end of the line",
757                  "", ""),
758
759  OWLCMD_VOID_CTX("edit:move-to-line-start", owl_editwin_move_to_line_start, 
760                  OWL_CTX_EDIT,
761                  "moves cursor to the beginning of the line",
762                  "", ""),
763
764  OWLCMD_VOID_CTX("edit:move-left", owl_editwin_key_left, 
765                  OWL_CTX_EDIT,
766                  "moves the cursor left by a character",
767                  "", ""),
768
769  OWLCMD_VOID_CTX("edit:move-right", owl_editwin_key_right,
770                  OWL_CTX_EDIT,
771                  "moves the cursor right by a character",
772                  "", ""),
773
774  OWLCMD_VOID_CTX("edit:delete-next-word", owl_editwin_delete_nextword,
775                  OWL_CTX_EDIT,
776                  "deletes the word to the right of the cursor",
777                  "", ""),
778
779  OWLCMD_VOID_CTX("edit:delete-prev-word", owl_editwin_delete_previousword,
780                  OWL_CTX_EDIT,
781                  "deletes the word to the left of the cursor",
782                  "", ""),
783
784  OWLCMD_VOID_CTX("edit:delete-prev-char", owl_editwin_backspace,
785                  OWL_CTX_EDIT,
786                  "deletes the character to the left of the cursor",
787                  "", ""),
788
789  OWLCMD_VOID_CTX("edit:delete-next-char", owl_editwin_delete_char, 
790                  OWL_CTX_EDIT,
791                  "deletes the character to the right of the cursor",
792                  "", ""),
793
794  OWLCMD_VOID_CTX("edit:delete-to-line-end", owl_editwin_delete_to_endofline,
795                  OWL_CTX_EDIT,
796                  "deletes from the cursor to the end of the line",
797                  "", ""),
798
799  OWLCMD_VOID_CTX("edit:delete-all", owl_editwin_clear, 
800                  OWL_CTX_EDIT,
801                  "deletes all of the contents of the buffer",
802                  "", ""),
803
804  OWLCMD_VOID_CTX("edit:transpose-chars", owl_editwin_transpose_chars,
805                  OWL_CTX_EDIT,
806                  "Interchange characters around point, moving forward one character.",
807                  "", ""),
808
809  OWLCMD_VOID_CTX("edit:fill-paragraph", owl_editwin_fill_paragraph, 
810                  OWL_CTX_EDIT,
811                  "fills the current paragraph to line-wrap well",
812                  "", ""),
813
814  OWLCMD_VOID_CTX("edit:recenter", owl_editwin_recenter, 
815                  OWL_CTX_EDIT,
816                  "recenters the buffer",
817                  "", ""),
818
819  OWLCMD_ARGS_CTX("edit:insert-text", owl_command_edit_insert_text, 
820                  OWL_CTX_EDIT,
821                  "inserts text into the buffer",
822                  "edit:insert-text <text>", ""),
823
824  OWLCMD_VOID_CTX("edit:cancel", owl_command_edit_cancel, 
825                  OWL_CTX_EDIT,
826                  "cancels the current command",
827                  "", ""),
828
829  OWLCMD_VOID_CTX("edit:history-next", owl_command_edit_history_next, 
830                  OWL_CTX_EDIT,
831                  "replaces the text with the previous history",
832                  "", ""),
833
834  OWLCMD_VOID_CTX("edit:history-prev", owl_command_edit_history_prev, 
835                  OWL_CTX_EDIT,
836                  "replaces the text with the previous history",
837                  "", ""),
838
839  OWLCMD_VOID_CTX("editline:done", owl_command_editline_done, 
840                  OWL_CTX_EDITLINE,
841                  "completes the command (eg, executes command being composed)",
842                  "", ""),
843
844  OWLCMD_VOID_CTX("editresponse:done", owl_command_editresponse_done, 
845                  OWL_CTX_EDITRESPONSE,
846                  "completes the response to a question",
847                  "", ""),
848
849  OWLCMD_VOID_CTX("editmulti:move-up-line", owl_editwin_key_up, 
850                  OWL_CTX_EDITMULTI,
851                  "moves the cursor up one line",
852                  "", ""),
853
854  OWLCMD_VOID_CTX("editmulti:move-down-line", owl_editwin_key_down, 
855                  OWL_CTX_EDITMULTI,
856                  "moves the cursor down one line",
857                  "", ""),
858
859  OWLCMD_VOID_CTX("editmulti:done", owl_command_editmulti_done, 
860                  OWL_CTX_EDITMULTI,
861                  "completes the command (eg, sends message being composed)",
862                  "", ""),
863
864  OWLCMD_VOID_CTX("editmulti:done-or-delete", owl_command_editmulti_done_or_delete, 
865                  OWL_CTX_EDITMULTI,
866                  "completes the command, but only if at end of message",
867                  "", 
868                  "If only whitespace is to the right of the cursor,\n"
869                  "runs 'editmulti:done'.\n"\
870                  "Otherwise runs 'edit:delete-next-char'\n"),
871
872  /****************************************************************/
873  /********************** POPLESS-SPECIFIC ************************/
874  /****************************************************************/
875
876  OWLCMD_VOID_CTX("popless:scroll-down-page", owl_viewwin_pagedown, 
877                  OWL_CTX_POPLESS,
878                  "scrolls down one page",
879                  "", ""),
880
881  OWLCMD_VOID_CTX("popless:scroll-down-line", owl_viewwin_linedown, 
882                  OWL_CTX_POPLESS,
883                  "scrolls down one line",
884                  "", ""),
885
886  OWLCMD_VOID_CTX("popless:scroll-up-page", owl_viewwin_pageup, 
887                  OWL_CTX_POPLESS,
888                  "scrolls up one page",
889                  "", ""),
890
891  OWLCMD_VOID_CTX("popless:scroll-up-line", owl_viewwin_lineup, 
892                  OWL_CTX_POPLESS,
893                  "scrolls up one line",
894                  "", ""),
895
896  OWLCMD_VOID_CTX("popless:scroll-to-top", owl_viewwin_top, 
897                  OWL_CTX_POPLESS,
898                  "scrolls to the top of the buffer",
899                  "", ""),
900
901  OWLCMD_VOID_CTX("popless:scroll-to-bottom", owl_viewwin_bottom, 
902                  OWL_CTX_POPLESS,
903                  "scrolls to the bottom of the buffer",
904                  "", ""),
905
906  OWLCMD_INT_CTX ("popless:scroll-right", owl_viewwin_right, 
907                  OWL_CTX_POPLESS,
908                  "scrolls right in the buffer",
909                  "popless:scroll-right <num-chars>", ""),
910
911  OWLCMD_INT_CTX ("popless:scroll-left", owl_viewwin_left, 
912                  OWL_CTX_POPLESS,
913                  "scrolls left in the buffer",
914                  "popless:scroll-left <num-chars>", ""),
915
916  OWLCMD_VOID_CTX("popless:quit", owl_command_popless_quit, 
917                  OWL_CTX_POPLESS,
918                  "exits the popless window",
919                  "", ""),
920
921  /* This line MUST be last! */
922  { NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
923
924};
925
926void owl_command_info()
927{
928  owl_function_info();
929}
930
931void owl_command_nop()
932{
933}
934
935char *owl_command_help(int argc, char **argv, char *buff)
936{
937  if (argc!=2) {
938    owl_help();
939    return NULL;
940  }
941 
942  owl_function_help_for_command(argv[1]);
943  return NULL;
944}
945
946char *owl_command_zlist(int argc, char **argv, char *buff)
947{
948  int elapsed=0, timesort=0;
949  char *file=NULL;
950
951  argc--;
952  argv++;
953  while (argc) {
954    if (!strcmp(argv[0], "-e")) {
955      elapsed=1;
956      argc--;
957      argv++;
958    } else if (!strcmp(argv[0], "-t")) {
959      timesort=1;
960      argc--;
961      argv++;
962    } else if (!strcmp(argv[0], "-f")) {
963      if (argc==1) {
964        owl_function_makemsg("zlist: -f needs an argument");
965        return(NULL);
966      }
967      file=argv[1];
968      argc-=2;
969      argv+=2;
970    } else {
971      owl_function_makemsg("zlist: unknown argument");
972      return(NULL);
973    }
974  }
975  owl_function_buddylist(0, 1, file);
976  return(NULL);
977}
978
979char *owl_command_alist()
980{
981  owl_function_buddylist(1, 0, NULL);
982  return(NULL);
983}
984
985char *owl_command_blist()
986{
987  owl_function_buddylist(1, 1, NULL);
988  return(NULL);
989}
990
991char *owl_command_toggleoneline()
992{
993  owl_function_toggleoneline();
994  return(NULL);
995}
996
997void owl_command_about()
998{
999  owl_function_about();
1000}
1001
1002void owl_command_version()
1003{
1004  char buff[1024];
1005
1006  sprintf(buff, "Owl version %s", OWL_VERSION_STRING);
1007  owl_function_makemsg(buff);
1008}
1009
1010char *owl_command_aim(int argc, char **argv, char *buff)
1011{
1012  if (argc<2) {
1013    owl_function_makemsg("not enough arguments to aim command");
1014    return(NULL);
1015  }
1016
1017  if (!strcmp(argv[1], "search")) {
1018    if (argc!=3) {
1019      owl_function_makemsg("not enough arguments to aim search command");
1020      return(NULL);
1021    }
1022    owl_aim_search(argv[2]);
1023  } else {
1024    owl_function_makemsg("unknown subcommand '%s' for aim command", argv[1]);
1025    return(NULL);
1026  }
1027  return(NULL);
1028}
1029
1030char *owl_command_addbuddy(int argc, char **argv, char *buff)
1031{
1032  if (argc!=3) {
1033    owl_function_makemsg("usage: addbuddy <protocol> <buddyname>");
1034    return(NULL);
1035  }
1036
1037  if (!strcasecmp(argv[1], "aim")) {
1038    if (!owl_global_is_aimloggedin(&g)) {
1039      owl_function_makemsg("addbuddy: You must be logged into aim to use this command.");
1040      return(NULL);
1041    }
1042    /*
1043    owl_function_makemsg("This function is not yet operational.  Stay tuned.");
1044    return(NULL);
1045    */
1046    owl_aim_addbuddy(argv[2]);
1047    owl_function_makemsg("%s added as AIM buddy for %s", argv[2], owl_global_get_aim_screenname(&g));
1048  } else if (!strcasecmp(argv[1], "zephyr")) {
1049    owl_zephyr_addbuddy(argv[2]);
1050    owl_function_makemsg("%s added as zephyr buddy", argv[2]);
1051  } else {
1052    owl_function_makemsg("addbuddy: currently the only supported protocols are 'zephyr' and 'aim'");
1053  }
1054
1055  return(NULL);
1056}
1057
1058char *owl_command_delbuddy(int argc, char **argv, char *buff)
1059{
1060  if (argc!=3) {
1061    owl_function_makemsg("usage: delbuddy <protocol> <buddyname>");
1062    return(NULL);
1063  }
1064
1065  if (!strcasecmp(argv[1], "aim")) {
1066    if (!owl_global_is_aimloggedin(&g)) {
1067      owl_function_makemsg("delbuddy: You must be logged into aim to use this command.");
1068      return(NULL);
1069    }
1070    owl_aim_delbuddy(argv[2]);
1071    owl_function_makemsg("%s deleted as AIM buddy for %s", argv[2], owl_global_get_aim_screenname(&g));
1072  } else if (!strcasecmp(argv[1], "zephyr")) {
1073    owl_zephyr_delbuddy(argv[2]);
1074    owl_function_makemsg("%s deleted as zephyr buddy", argv[2]);
1075  } else {
1076    owl_function_makemsg("delbuddy: currently the only supported protocols are 'zephyr' and 'aim'");
1077  }
1078
1079  return(NULL);
1080}
1081
1082char *owl_command_join(int argc, char **argv, char *buff)
1083{
1084  if (argc!=3 && argc!=4) {
1085    owl_function_makemsg("usage: join <protocol> <buddyname> [exchange]");
1086    return(NULL);
1087  }
1088
1089  if (!strcasecmp(argv[1], "aim")) {
1090    if (!owl_global_is_aimloggedin(&g)) {
1091      owl_function_makemsg("join aim: You must be logged into aim to use this command.");
1092      return(NULL);
1093    }
1094    if (argc==3) {
1095      owl_aim_chat_join(argv[2], 4);
1096    } else {
1097      owl_aim_chat_join(argv[2], atoi(argv[3]));
1098    }
1099    /* owl_function_makemsg("%s deleted as AIM buddy for %s", argv[2], owl_global_get_aim_screenname(&g)); */
1100  } else {
1101    owl_function_makemsg("join: currently the only supported protocol is 'aim'");
1102  }
1103  return(NULL);
1104}
1105
1106char *owl_command_startup(int argc, char **argv, char *buff)
1107{
1108  char *ptr;
1109
1110  if (argc<2) {
1111    owl_function_makemsg("usage: %s <commands> ...", argv[0]);
1112    return(NULL);
1113  }
1114
1115  ptr=strchr(buff, ' ');
1116  if (!ptr) {
1117    owl_function_makemsg("Parse error finding command for startup");
1118    return(NULL);
1119  }
1120
1121  owl_function_command(ptr+1);
1122  owl_function_addstartup(ptr+1);
1123
1124  return(NULL);
1125}
1126
1127char *owl_command_unstartup(int argc, char **argv, char *buff)
1128{
1129  char *ptr;
1130
1131  if (argc<2) {
1132    owl_function_makemsg("usage: %s <commands> ...", argv[0]);
1133    return(NULL);
1134  }
1135
1136  ptr=strchr(buff, ' ');
1137  if (!ptr) {
1138    owl_function_makemsg("Parse error finding command for unstartup");
1139    return(NULL);
1140  }
1141
1142  owl_function_delstartup(ptr+1);
1143
1144  return(NULL);
1145}
1146
1147char *owl_command_dump(int argc, char **argv, char *buff)
1148{
1149  char *filename;
1150 
1151  if (argc!=2) {
1152    owl_function_makemsg("usage: dump <filename>");
1153    return(NULL);
1154  }
1155  filename=owl_util_makepath(argv[1]);
1156  owl_function_dump(filename);
1157  owl_free(filename);
1158  return(NULL);
1159}
1160
1161char *owl_command_source(int argc, char **argv, char *buff)
1162{
1163  if (argc!=2) {
1164    owl_function_makemsg("usage: source <filename>");
1165    return(NULL);
1166  }
1167
1168  owl_function_source(argv[1]);
1169  return(NULL);
1170}
1171
1172char *owl_command_next(int argc, char **argv, char *buff)
1173{
1174  char *filter=NULL;
1175  int skip_deleted=0, last_if_none=0;
1176  while (argc>1) {
1177    if (argc>=1 && !strcmp(argv[1], "--skip-deleted")) {
1178      skip_deleted=1;
1179      argc-=1; argv+=1; 
1180    } else if (argc>=1 && !strcmp(argv[1], "--last-if-none")) {
1181      last_if_none=1;
1182      argc-=1; argv+=1; 
1183    } else if (argc>=2 && !strcmp(argv[1], "--filter")) {
1184      filter = owl_strdup(argv[2]);
1185      argc-=2; argv+=2; 
1186    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter")) {
1187      filter = owl_function_smartfilter(0);
1188      argc-=2; argv+=2; 
1189    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter-instance")) {
1190      filter = owl_function_smartfilter(1);
1191      argc-=2; argv+=2; 
1192    } else {
1193      owl_function_makemsg("Invalid arguments to command 'next'.");
1194      return(NULL);
1195    }
1196  }
1197  owl_function_nextmsg_full(filter, skip_deleted, last_if_none);
1198  if (filter) owl_free(filter);
1199  return(NULL);
1200}
1201
1202char *owl_command_prev(int argc, char **argv, char *buff)
1203{
1204  char *filter=NULL;
1205  int skip_deleted=0, first_if_none=0;
1206  while (argc>1) {
1207    if (argc>=1 && !strcmp(argv[1], "--skip-deleted")) {
1208      skip_deleted=1;
1209      argc-=1; argv+=1; 
1210    } else if (argc>=1 && !strcmp(argv[1], "--first-if-none")) {
1211      first_if_none=1;
1212      argc-=1; argv+=1; 
1213    } else if (argc>=2 && !strcmp(argv[1], "--filter")) {
1214      filter = owl_strdup(argv[2]);
1215      argc-=2; argv+=2; 
1216    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter")) {
1217      filter = owl_function_smartfilter(0);
1218      argc-=2; argv+=2; 
1219    } else if (argc>=2 && !strcmp(argv[1], "--smart-filter-instance")) {
1220      filter = owl_function_smartfilter(1);
1221      argc-=2; argv+=2; 
1222   } else {
1223      owl_function_makemsg("Invalid arguments to command 'prev'.");
1224      return(NULL);
1225    }
1226  }
1227  owl_function_prevmsg_full(filter, skip_deleted, first_if_none);
1228  if (filter) owl_free(filter);
1229  return(NULL);
1230}
1231
1232char *owl_command_smartnarrow(int argc, char **argv, char *buff)
1233{
1234  char *filtname = NULL;
1235
1236  if (argc == 1) {
1237    filtname = owl_function_smartfilter(0);
1238  } else if (argc == 2 && (!strcmp(argv[1], "-i") || !strcmp(argv[1], "--instance"))) {
1239    filtname = owl_function_smartfilter(1);
1240  } else {
1241    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);   
1242  }
1243  if (filtname) {
1244    owl_function_change_currentview_filter(filtname);
1245    owl_free(filtname);
1246  }
1247  return NULL;
1248}
1249
1250char *owl_command_smartfilter(int argc, char **argv, char *buff)
1251{
1252  char *filtname = NULL;
1253
1254  if (argc == 1) {
1255    filtname = owl_function_smartfilter(0);
1256  } else if (argc == 2 && (!strcmp(argv[1], "-i") || !strcmp(argv[1], "--instance"))) {
1257    filtname = owl_function_smartfilter(1);
1258  } else {
1259    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);   
1260  }
1261  return filtname;
1262}
1263
1264void owl_command_expunge()
1265{
1266  owl_function_expunge();
1267}
1268
1269void owl_command_first()
1270{
1271  owl_global_set_rightshift(&g, 0);
1272  owl_function_firstmsg();
1273}
1274
1275void owl_command_last()
1276{
1277  owl_function_lastmsg();
1278}
1279
1280void owl_command_resize()
1281{
1282  owl_function_resize();
1283}
1284
1285void owl_command_redisplay()
1286{
1287  owl_function_full_redisplay();
1288  owl_global_set_needrefresh(&g);
1289}
1290
1291void owl_command_shift_right()
1292{
1293  owl_function_shift_right();
1294}
1295
1296void owl_command_shift_left()
1297{
1298  owl_function_shift_left();
1299}
1300
1301void owl_command_unsuball()
1302{
1303  owl_function_unsuball();
1304}
1305
1306char *owl_command_loadsubs(int argc, char **argv, char *buff)
1307{
1308  if (argc == 2) {
1309    owl_function_loadsubs(argv[1]);
1310  } else if (argc == 1) {
1311    owl_function_loadsubs(NULL);
1312  } else {
1313    owl_function_makemsg("Wrong number of arguments for load-subs.");
1314    return(NULL);
1315  }
1316  return(NULL);
1317}
1318
1319
1320char *owl_command_loadloginsubs(int argc, char **argv, char *buff)
1321{
1322  if (argc == 2) {
1323    owl_function_loadloginsubs(argv[1]);
1324  } else if (argc == 1) {
1325    owl_function_loadloginsubs(NULL);
1326  } else {
1327    owl_function_makemsg("Wrong number of arguments for load-subs.");
1328    return(NULL);
1329  }
1330  return(NULL);
1331}
1332
1333void owl_command_suspend()
1334{
1335  owl_function_suspend();
1336}
1337
1338char *owl_command_start_command(int argc, char **argv, char *buff)
1339{
1340  buff = skiptokens(buff, 1);
1341  owl_function_start_command(buff);
1342  return(NULL);
1343}
1344
1345char *owl_command_start_question(int argc, char **argv, char *buff)
1346{
1347  buff = skiptokens(buff, 1);
1348  owl_function_start_question(buff);
1349  return(NULL);
1350}
1351
1352char *owl_command_start_password(int argc, char **argv, char *buff)
1353{
1354  buff = skiptokens(buff, 1);
1355  owl_function_start_password(buff);
1356  return(NULL);
1357}
1358
1359char *owl_command_zaway(int argc, char **argv, char *buff)
1360{
1361  if ((argc==1) ||
1362      ((argc==2) && !strcmp(argv[1], "on"))) {
1363    owl_global_set_zaway_msg(&g, owl_global_get_zaway_msg_default(&g));
1364    owl_function_zaway_on();
1365    return NULL;
1366  }
1367
1368  if (argc==2 && !strcmp(argv[1], "off")) {
1369    owl_function_zaway_off();
1370    return NULL;
1371  }
1372
1373  if (argc==2 && !strcmp(argv[1], "toggle")) {
1374    owl_function_zaway_toggle();
1375    return NULL;
1376  }
1377
1378  buff = skiptokens(buff, 1);
1379  owl_global_set_zaway_msg(&g, buff);
1380  owl_function_zaway_on();
1381  return NULL;
1382}
1383
1384
1385char *owl_command_aaway(int argc, char **argv, char *buff)
1386{
1387  if ((argc==1) ||
1388      ((argc==2) && !strcmp(argv[1], "on"))) {
1389    owl_global_set_aaway_msg(&g, owl_global_get_aaway_msg_default(&g));
1390    owl_function_aaway_on();
1391    return NULL;
1392  }
1393
1394  if (argc==2 && !strcmp(argv[1], "off")) {
1395    owl_function_aaway_off();
1396    return NULL;
1397  }
1398
1399  if (argc==2 && !strcmp(argv[1], "toggle")) {
1400    owl_function_aaway_toggle();
1401    return NULL;
1402  }
1403
1404  buff = skiptokens(buff, 1);
1405  owl_global_set_aaway_msg(&g, buff);
1406  owl_function_aaway_on();
1407  return NULL;
1408}
1409
1410
1411char *owl_command_away(int argc, char **argv, char *buff)
1412{
1413  if ((argc==1) ||
1414      ((argc==2) && !strcmp(argv[1], "on"))) {
1415    owl_global_set_aaway_msg(&g, owl_global_get_aaway_msg_default(&g));
1416    owl_global_set_zaway_msg(&g, owl_global_get_zaway_msg_default(&g));
1417    owl_function_aaway_on();
1418    owl_function_zaway_on();
1419    owl_function_makemsg("Away messages set.", owl_global_get_aaway_msg_default(&g));
1420    return NULL;
1421  }
1422
1423  if (argc==2 && !strcmp(argv[1], "off")) {
1424    owl_function_aaway_off();
1425    owl_function_zaway_off();
1426    return NULL;
1427  }
1428
1429  if (argc==2 && !strcmp(argv[1], "toggle")) {
1430    /* if either one is on, turn it off, otherwise toggle both (turn
1431     *  them both on)
1432     */
1433    if (!owl_global_is_zaway(&g) && !owl_global_is_aaway(&g)) {
1434      owl_function_aaway_toggle();
1435      owl_function_zaway_toggle();
1436      owl_function_makemsg("Away messages set.");
1437    } else {
1438      if (owl_global_is_zaway(&g)) owl_function_zaway_toggle();
1439      if (owl_global_is_aaway(&g)) owl_function_aaway_toggle();
1440      owl_function_makemsg("Away messages off.");
1441    }
1442    return NULL;
1443  }
1444
1445  buff = skiptokens(buff, 1);
1446  owl_global_set_aaway_msg(&g, buff);
1447  owl_global_set_zaway_msg(&g, buff);
1448  owl_function_aaway_on();
1449  owl_function_zaway_on();
1450  owl_function_makemsg("Away messages set.");
1451  return NULL;
1452}
1453
1454char *owl_command_set(int argc, char **argv, char *buff)
1455{
1456  char *var, *val;
1457  int  silent=0;
1458  int requirebool=0;
1459
1460  if (argc == 1) {
1461    owl_function_printallvars();
1462    return NULL;
1463  } 
1464
1465  if (argc > 1 && !strcmp("-q",argv[1])) {
1466    silent = 1;
1467    argc--; argv++;
1468  }
1469
1470  if (argc == 2) {
1471    var=argv[1];
1472    val="on";
1473    requirebool=1;
1474  } else if (argc == 3) {
1475    var=argv[1];
1476    val=argv[2];
1477  } else {
1478    owl_function_makemsg("Wrong number of arguments for set command");
1479    return NULL;
1480  }
1481  owl_variable_set_fromstring(owl_global_get_vardict(&g), var, val, !silent, requirebool);
1482  return NULL;
1483}
1484
1485char *owl_command_unset(int argc, char **argv, char *buff)
1486{
1487  char *var, *val;
1488  int  silent=0;
1489
1490  if (argc > 1 && !strcmp("-q",argv[1])) {
1491    silent = 1;
1492    argc--; argv++;
1493  }
1494  if (argc == 2) {
1495    var=argv[1];
1496    val="off";
1497  } else {
1498    owl_function_makemsg("Wrong number of arguments for unset command");
1499    return NULL;
1500  }
1501  owl_variable_set_fromstring(owl_global_get_vardict(&g), var, val, !silent, 1);
1502  return NULL;
1503}
1504
1505char *owl_command_print(int argc, char **argv, char *buff)
1506{
1507  char *var;
1508  char valbuff[1024];
1509
1510  if (argc==1) {
1511    owl_function_printallvars();
1512    return NULL;
1513  } else if (argc!=2) {
1514    owl_function_makemsg("Wrong number of arguments for print command");
1515    return NULL;
1516  }
1517
1518  var=argv[1];
1519   
1520  if (0 == owl_variable_get_tostring(owl_global_get_vardict(&g), 
1521                                     var, valbuff, 1024)) {
1522    owl_function_makemsg("%s = '%s'", var, valbuff);
1523  } else {
1524    owl_function_makemsg("Unknown variable '%s'.", var);
1525  }
1526  return NULL;
1527}
1528
1529
1530char *owl_command_exec(int argc, char **argv, char *buff)
1531{
1532  return owl_function_exec(argc, argv, buff, 0);
1533}
1534
1535char *owl_command_pexec(int argc, char **argv, char *buff)
1536{
1537  return owl_function_exec(argc, argv, buff, 1);
1538}
1539
1540char *owl_command_aexec(int argc, char **argv, char *buff)
1541{
1542  return owl_function_exec(argc, argv, buff, 2);
1543}
1544
1545char *owl_command_perl(int argc, char **argv, char *buff)
1546{
1547  return owl_function_perl(argc, argv, buff, 0);
1548}
1549
1550char *owl_command_pperl(int argc, char **argv, char *buff)
1551{
1552  return owl_function_perl(argc, argv, buff, 1);
1553}
1554
1555char *owl_command_aperl(int argc, char **argv, char *buff)
1556{
1557  return owl_function_perl(argc, argv, buff, 2);
1558}
1559
1560char *owl_command_multi(int argc, char **argv, char *buff)
1561{
1562  char *lastrv = NULL, *dupbuff, *newbuff;
1563  char **commands;
1564  int  ncommands, i;
1565  if (argc < 2) {
1566    owl_function_makemsg("Invalid arguments to 'multi' command.");   
1567    return NULL;
1568  }
1569  dupbuff = owl_strdup(buff);
1570  newbuff = skiptokens(dupbuff, 1);
1571  if (!strcmp(argv[0], "(")) {
1572    for (i=strlen(newbuff)-1; i>=0; i--) {
1573      if (newbuff[i] == ')') {
1574        newbuff[i] = '\0';
1575        break;
1576      } else if (newbuff[i] != ' ') {
1577        owl_function_makemsg("Invalid arguments to 'multi' command.");   
1578        owl_free(newbuff);
1579        return NULL;
1580      }
1581    }
1582  }
1583  commands = atokenize(newbuff, ";", &ncommands);
1584  for (i=0; i<ncommands; i++) {
1585    if (lastrv) {
1586      owl_free(lastrv);
1587    }
1588    lastrv = owl_function_command(commands[i]);
1589  }
1590  owl_free(dupbuff);
1591  atokenize_free(commands, ncommands);
1592  return lastrv;
1593}
1594
1595
1596char *owl_command_alias(int argc, char **argv, char *buff)
1597{
1598  if (argc < 3) {
1599    owl_function_makemsg("Invalid arguments to 'alias' command.");
1600    return NULL;
1601  }
1602  buff = skiptokens(buff, 2);
1603  owl_function_command_alias(argv[1], buff);
1604  return (NULL);
1605}
1606
1607
1608char *owl_command_bindkey(int argc, char **argv, char *buff)
1609{
1610  owl_keymap *km;
1611  int ret;
1612
1613  if (argc < 5 || strcmp(argv[3], "command")) {
1614    owl_function_makemsg("Usage: bindkey <keymap> <binding> command <cmd>");
1615    return NULL;
1616  }
1617  km = owl_keyhandler_get_keymap(owl_global_get_keyhandler(&g), argv[1]);
1618  if (!km) {
1619    owl_function_makemsg("No such keymap '%s'", argv[1]);
1620    return NULL;
1621  }
1622  buff = skiptokens(buff, 4);
1623  ret = owl_keymap_create_binding(km, argv[2], buff, NULL, "*user*");
1624  if (ret!=0) {
1625    owl_function_makemsg("Unable to bind '%s' in keymap '%s' to '%s'.",
1626                         argv[2], argv[1], buff);
1627    return NULL;
1628  }
1629  return NULL;
1630}
1631
1632char *owl_command_style(int argc, char **argv, char *buff) {
1633  owl_style *s;
1634
1635  /* Usage: style <name> perl <function> */
1636  if (argc != 4 || strcmp(argv[2], "perl")) {
1637    owl_function_makemsg("Usage: style <name> perl <function>");
1638    return NULL;
1639  }
1640  if (!owl_perlconfig_is_function(argv[3])) {
1641    owl_function_makemsg("Unable to create style '%s': no perl function '%s'",
1642                         argv[1], argv[3]);
1643    return NULL;
1644  }
1645  s=owl_malloc(sizeof(owl_style));
1646  owl_style_create_perl(s, argv[1], argv[3], NULL);
1647  owl_global_add_style(&g, s);
1648
1649  return NULL;
1650}
1651
1652
1653void owl_command_quit()
1654{
1655  owl_function_quit();
1656}
1657
1658char *owl_command_debug(int argc, char **argv, char *buff)
1659{
1660  if (argc<2) {
1661    owl_function_makemsg("Need at least one argument to debug command");
1662    return(NULL);
1663  }
1664
1665  if (!owl_global_is_debug_fast(&g)) {
1666    owl_function_makemsg("Debugging is not turned on");
1667    return(NULL);
1668  }
1669
1670  owl_function_debugmsg(argv[1]);
1671  return(NULL);
1672}
1673
1674char *owl_command_term(int argc, char **argv, char *buff)
1675{
1676  if (argc<2) {
1677    owl_function_makemsg("Need at least one argument to the term command");
1678    return(NULL);
1679  }
1680
1681  if (!strcmp(argv[1], "raise")) {
1682    owl_function_xterm_raise();
1683  } else if (!strcmp(argv[1], "deiconify")) {
1684    owl_function_xterm_deiconify();
1685  } else {
1686    owl_function_makemsg("Unknown terminal subcommand");
1687  }
1688  return(NULL);
1689}
1690
1691char *owl_command_zlog(int argc, char **argv, char *buff)
1692{
1693  if ((argc<2) || (argc>3)) {
1694    owl_function_makemsg("Wrong number of arguments for zlog command");
1695    return(NULL);
1696  }
1697
1698  if (!strcmp(argv[1], "in")) {
1699    if (argc>2) {
1700      owl_global_set_tty(&g, argv[2]);
1701    }
1702    owl_zephyr_zlog_in();
1703  } else if (!strcmp(argv[1], "out")) {
1704    if (argc!=2) {
1705      owl_function_makemsg("Wrong number of arguments for zlog command");
1706      return(NULL);
1707    }
1708    owl_zephyr_zlog_out();
1709  } else {
1710    owl_function_makemsg("Invalid subcommand for zlog");
1711  }
1712  return(NULL);
1713}
1714
1715
1716void owl_command_zlog_out(void)
1717{
1718  owl_zephyr_zlog_out();
1719}
1720
1721
1722char *owl_command_subscribe(int argc, char **argv, char *buff)
1723{
1724  char *recip="";
1725  int temp=0;
1726 
1727  if (argc<3) {
1728    owl_function_makemsg("Not enough arguments to the subscribe command");
1729    return(NULL);
1730  }
1731  argc--;
1732  argv++;
1733
1734  if (!strcmp(argv[0], "-t")) {
1735    temp=1;
1736    argc--;
1737    argv++;
1738  }
1739  if (argc<2) {
1740    owl_function_makemsg("Not enough arguments to the subscribe command");
1741    return(NULL);
1742  }
1743
1744  if (argc>3) {
1745    owl_function_makemsg("Too many arguments to the subscribe command");
1746    return(NULL);
1747  }
1748
1749  if (argc==2) {
1750    recip="";
1751  } else if (argc==3) {
1752    recip=argv[2];
1753  }
1754
1755  owl_function_subscribe(argv[0], argv[1], recip);
1756  if (!temp) {
1757    owl_zephyr_addsub(NULL, argv[0], argv[1], recip);
1758  }
1759  return(NULL);
1760}
1761
1762
1763char *owl_command_unsubscribe(int argc, char **argv, char *buff)
1764{
1765  char *recip="";
1766  int temp=0;
1767
1768  if (argc<3) {
1769    owl_function_makemsg("Not enough arguments to the unsubscribe command");
1770    return(NULL);
1771  }
1772  argc--;
1773  argv++;
1774
1775  if (!strcmp(argv[0], "-t")) {
1776    temp=1;
1777    argc--;
1778    argv++;
1779  }
1780  if (argc<2) {
1781    owl_function_makemsg("Not enough arguments to the subscribe command");
1782    return(NULL);
1783  }
1784
1785  if (argc>3) {
1786    owl_function_makemsg("Too many arguments to the unsubscribe command");
1787    return(NULL);
1788  }
1789
1790  if (argc==2) {
1791    recip="";
1792  } else if (argc==3) {
1793    recip=argv[2];
1794  }
1795
1796  owl_function_unsubscribe(argv[0], argv[1], recip);
1797  if (!temp) {
1798    owl_zephyr_delsub(NULL, argv[0], argv[1], recip);
1799  }
1800  return(NULL);
1801}
1802
1803char *owl_command_echo(int argc, char **argv, char *buff)
1804{
1805  buff = skiptokens(buff, 1);
1806  owl_function_popless_text(buff);
1807  return NULL;
1808}
1809
1810void owl_command_getsubs(void)
1811{
1812  owl_function_getsubs();
1813}
1814
1815void owl_command_status(void)
1816{
1817  owl_function_status();
1818}
1819
1820char *owl_command_zwrite(int argc, char **argv, char *buff)
1821{
1822  owl_zwrite z;
1823
1824  if (!owl_global_is_havezephyr(&g)) {
1825    owl_function_makemsg("Zephyr is not available");
1826    return(NULL);
1827  }
1828  /* check for a zwrite -m */
1829  owl_zwrite_create_from_line(&z, buff);
1830  if (owl_zwrite_is_message_set(&z)) {
1831    owl_function_zwrite(buff, NULL);
1832    owl_zwrite_free(&z);
1833    return (NULL);
1834  }
1835
1836  if (argc < 2) {
1837    owl_function_makemsg("Not enough arguments to the zwrite command.");
1838  } else {
1839    owl_function_zwrite_setup(buff);
1840  }
1841  return(NULL);
1842}
1843
1844char *owl_command_aimwrite(int argc, char **argv, char *buff)
1845{
1846  char *newbuff;
1847  int i, j;
1848 
1849  if (!owl_global_is_aimloggedin(&g)) {
1850    owl_function_makemsg("You are not logged in to AIM.");
1851    return(NULL);
1852  }
1853
1854  if (argc < 2) {
1855    owl_function_makemsg("Not enough arguments to the aimwrite command.");
1856    return(NULL);
1857  }
1858
1859  /* squish arguments together to make one screenname w/o spaces for now */
1860  newbuff=owl_malloc(strlen(buff)+5);
1861  sprintf(newbuff, "%s ", argv[0]);
1862  j=argc-1;
1863  for (i=0; i<j; i++) {
1864    strcat(newbuff, argv[i+1]);
1865  }
1866   
1867  owl_function_aimwrite_setup(newbuff);
1868  owl_free(newbuff);
1869  return(NULL);
1870}
1871
1872char *owl_command_loopwrite(int argc, char **argv, char *buff)
1873{
1874  owl_function_loopwrite_setup();
1875  return(NULL);
1876}
1877
1878char *owl_command_zcrypt(int argc, char **argv, char *buff)
1879{
1880#ifdef OWL_ENABLE_ZCRYPT
1881  owl_zwrite z;
1882
1883  if (!owl_global_is_havezephyr(&g)) {
1884    owl_function_makemsg("Zephyr is not available");
1885    return(NULL);
1886  }
1887  /* check for a zcrypt -m */
1888  owl_zwrite_create_from_line(&z, buff);
1889  if (owl_zwrite_is_message_set(&z)) {
1890    owl_function_zcrypt(buff, NULL);
1891    owl_zwrite_free(&z);
1892    return (NULL);
1893  }
1894
1895  if (argc < 2) {
1896    owl_function_makemsg("Not enough arguments to the zcrypt command.");
1897  } else {
1898    owl_function_zwrite_setup(buff);
1899  }
1900  return(NULL);
1901#else
1902  owl_function_makemsg("This Owl does not support zcrypt");
1903#endif
1904}
1905
1906char *owl_command_reply(int argc, char **argv, char *buff)
1907{
1908  int edit=0;
1909 
1910  if (argc>=2 && !strcmp("-e", argv[1])) {
1911    edit=1;
1912    argv++;
1913    argc--;
1914  }
1915
1916  if ((argc==1) || (argc==2 && !strcmp(argv[1], "all"))) {   
1917    owl_function_reply(0, !edit);
1918  } else if (argc==2 && !strcmp(argv[1], "sender")) {
1919    owl_function_reply(1, !edit);
1920  } else if (argc==2 && !strcmp(argv[1], "zaway")) {
1921    owl_message *m;
1922    owl_view    *v;
1923    v = owl_global_get_current_view(&g);   
1924    m = owl_view_get_element(v, owl_global_get_curmsg(&g));
1925    if (m) owl_zephyr_zaway(m);
1926  } else {
1927    owl_function_makemsg("Invalid arguments to the reply command.");
1928  }
1929  return NULL;
1930}
1931
1932char *owl_command_filter(int argc, char **argv, char *buff)
1933{
1934  owl_function_create_filter(argc, argv);
1935  return NULL;
1936}
1937
1938char *owl_command_zlocate(int argc, char **argv, char *buff)
1939{
1940  int auth;
1941 
1942  if (argc<2) {
1943    owl_function_makemsg("Too few arguments for zlocate command");
1944    return NULL;
1945  }
1946
1947  auth=1;
1948  if (!strcmp(argv[1], "-d")) {
1949    if (argc>2) {
1950      auth=0;
1951      argc--;
1952      argv++;
1953    } else {
1954      owl_function_makemsg("Missing arguments for zlocate command");
1955      return NULL;
1956    }
1957  }
1958
1959  argc--;
1960  argv++;
1961  owl_function_zlocate(argc, argv, auth);
1962  return NULL;
1963}
1964
1965
1966/* Backwards compatability has made this kind of complicated:
1967 * view [<viewname>] [-f <filter> | -d <expression> | --home | -r ] [-s <style>]
1968 * view <filter>
1969 * view -d <expression>
1970 * view --home
1971 */
1972char *owl_command_view(int argc, char **argv, char *buff)
1973{
1974  /* First take the 'view --home' and 'view -r' cases */
1975  if (argc == 2) {
1976    if (!strcmp(argv[1], "--home")) {
1977      owl_function_change_currentview_filter(owl_global_get_view_home(&g));
1978      return(NULL);
1979    } else if (!strcmp(argv[1], "-r")) {
1980      char *foo;
1981      foo=owl_function_create_negative_filter(owl_view_get_filtname(owl_global_get_current_view(&g)));
1982      owl_function_change_currentview_filter(foo);
1983      owl_free(foo);
1984      return(NULL);
1985    }
1986  }
1987
1988  /* Now look for 'view <filter>' */
1989  if (argc==2) {
1990    owl_function_change_currentview_filter(argv[1]);
1991    return(NULL);
1992  }
1993
1994  /* Now get 'view -d <expression>' */
1995  if (argc>=3 && !strcmp(argv[1], "-d")) {
1996    char **myargv;
1997    int i;
1998
1999    myargv=owl_malloc((argc*sizeof(char *))+50);
2000    myargv[0]="";
2001    myargv[1]="owl-dynamic";
2002    for (i=2; i<argc; i++) {
2003      myargv[i]=argv[i];
2004    }
2005    owl_function_create_filter(argc, myargv);
2006    owl_function_change_currentview_filter("owl-dynamic");
2007    owl_free(myargv);
2008    return NULL;
2009  }
2010
2011  /* Finally handle the general case */
2012  if (argc<3) {
2013    owl_function_makemsg("Too few arguments to the view command.");
2014    return(NULL);
2015  }
2016  argc--;
2017  argv++;
2018  if (strcmp(argv[0], "-f") &&
2019      strcmp(argv[0], "-d") &&
2020      strcmp(argv[0], "--home") &&
2021      strcmp(argv[0], "-s") &&
2022      strcmp(argv[0], "-r")) {
2023    if (strcmp(argv[0], "main")) {
2024      owl_function_makemsg("No view named '%s'", argv[0]);
2025      return(NULL);
2026    }
2027    argc--;
2028    argv++;
2029  }
2030  while (argc) {
2031    if (!strcmp(argv[0], "-f")) {
2032      if (argc<2) {
2033        owl_function_makemsg("Too few argments to the view command");
2034        return(NULL);
2035      }
2036      owl_function_change_currentview_filter(argv[1]);
2037      argc-=2;
2038      argv+=2;
2039    } else if (!strcmp(argv[0], "--home")) {
2040      owl_function_change_currentview_filter(owl_global_get_view_home(&g));
2041      argc--;
2042      argv++;
2043    } else if (!strcmp(argv[0], "-r")) {
2044      char *foo;
2045      foo=owl_function_create_negative_filter(owl_view_get_filtname(owl_global_get_current_view(&g)));
2046      owl_function_change_currentview_filter(foo);
2047    } else if (!strcmp(argv[0], "-s")) {
2048      if (argc<2) {
2049        owl_function_makemsg("Too few argments to the view command");
2050        return(NULL);
2051      }
2052      owl_function_change_style(owl_global_get_current_view(&g), argv[1]);
2053      argc-=2;
2054      argv+=2;
2055    } else {
2056      owl_function_makemsg("Too few argments to the view command");
2057      return(NULL);
2058    }
2059   
2060  }
2061  return(NULL);
2062}
2063
2064char *owl_command_show(int argc, char **argv, char *buff)
2065{
2066  if (argc<2) {
2067    owl_function_help_for_command("show");
2068    return NULL;
2069  }
2070
2071  if (!strcmp(argv[1], "filter") || !strcmp(argv[1], "filters")) {
2072    if (argc==2) {
2073      owl_function_show_filters();
2074    } else {
2075      owl_function_show_filter(argv[2]);
2076    }
2077  } else if (argc==2 
2078             && (!strcmp(argv[1], "zpunts") || !strcmp(argv[1], "zpunted"))) {
2079    owl_function_show_zpunts();
2080  } else if (!strcmp(argv[1], "command") || !strcmp(argv[1], "commands")) {
2081    if (argc==2) {
2082      owl_function_show_commands();
2083    } else {
2084      owl_function_show_command(argv[2]);
2085    }
2086  } else if (!strcmp(argv[1], "variable") || !strcmp(argv[1], "variables")) {
2087    if (argc==2) {
2088      owl_function_show_variables();
2089    } else {
2090      owl_function_show_variable(argv[2]);
2091    }
2092  } else if (!strcmp(argv[1], "keymap") || !strcmp(argv[1], "keymaps")) {
2093    if (argc==2) {
2094      owl_function_show_keymaps();
2095    } else {
2096      owl_function_show_keymap(argv[2]);
2097    }
2098  } else if (!strcmp(argv[1], "view")) {
2099    if (argc==3) {
2100      owl_function_show_view(argv[2]);
2101    } else {
2102      owl_function_show_view(NULL);
2103    }
2104  } else if (!strcmp(argv[1], "colors")) {
2105    owl_function_show_colors();
2106  } else if (!strcmp(argv[1], "styles")) {
2107    owl_function_show_styles();
2108  } else if (!strcmp(argv[1], "subs") || !strcmp(argv[1], "subscriptions")) {
2109    owl_function_getsubs();
2110  } else if (!strcmp(argv[1], "terminal") || !strcmp(argv[1], "term")) {
2111    owl_function_show_term();
2112  } else if (!strcmp(argv[1], "version")) {
2113    owl_function_about();
2114  } else if (!strcmp(argv[1], "status")) {
2115    owl_function_status();
2116  } else if (!strcmp(argv[1], "license")) {
2117    owl_function_show_license();
2118  } else if (!strcmp(argv[1], "startup")) {
2119    char *filename;
2120   
2121    filename=owl_sprintf("%s/%s", owl_global_get_homedir(&g), OWL_STARTUP_FILE);
2122    owl_function_popless_file(filename);
2123    owl_free(filename);
2124  } else if (!strcmp(argv[1], "errors")) {
2125    owl_function_showerrs();
2126  } else {
2127    owl_function_makemsg("Unknown subcommand for 'show' command (see 'help show' for allowed args)");
2128    return NULL;
2129  }
2130  return NULL;
2131}
2132
2133char *owl_command_viewclass(int argc, char **argv, char *buff)
2134{
2135  char *filtname;
2136  if (argc!=2) {
2137    owl_function_makemsg("Wrong number of arguments to viewclass command");
2138    return NULL;
2139  }
2140  filtname = owl_function_classinstfilt(argv[1], NULL);
2141  owl_function_change_currentview_filter(filtname);
2142  owl_free(filtname);
2143  return NULL;
2144}
2145
2146char *owl_command_viewuser(int argc, char **argv, char *buff)
2147{
2148  char *filtname;
2149  if (argc!=2) {
2150    owl_function_makemsg("Wrong number of arguments to viewuser command");
2151    return NULL;
2152  }
2153  filtname=owl_function_zuserfilt(argv[1]);
2154  owl_function_change_currentview_filter(filtname);
2155  owl_free(filtname);
2156  return NULL;
2157}
2158
2159
2160void owl_command_pop_message(void)
2161{
2162  owl_function_curmsg_to_popwin();
2163}
2164
2165void owl_command_openurl(void)
2166{
2167  owl_function_openurl();
2168}
2169
2170char *owl_command_delete(int argc, char **argv, char *buff)
2171{
2172  int move_after = 1;
2173
2174  if (argc>1 && !strcmp(argv[1], "--no-move")) {
2175    move_after = 0;
2176    argc--; 
2177    argv++;
2178  }
2179
2180  if (argc==1) {
2181    owl_function_deletecur(move_after);
2182    return NULL;
2183  }
2184
2185  if (argc==2 && !strcmp(argv[1], "view")) {
2186    owl_function_delete_curview_msgs(1);
2187    return NULL;
2188  }
2189
2190  if (argc==2 && !strcmp(argv[1], "trash")) {
2191    owl_function_delete_automsgs();
2192    return NULL;
2193  }
2194
2195  if (argc==3 && (!strcmp(argv[1], "-id") || !strcmp(argv[1], "--id"))) {
2196    owl_function_delete_by_id(atoi(argv[2]), 1);
2197    return NULL;
2198  }
2199
2200  owl_function_makemsg("Unknown arguments to delete command");
2201  return NULL;
2202}
2203
2204char *owl_command_undelete(int argc, char **argv, char *buff)
2205{
2206  int move_after = 1;
2207
2208  if (argc>1 && !strcmp(argv[1], "--no-move")) {
2209    move_after = 0;
2210    argc--; 
2211    argv++;
2212  }
2213
2214  if (argc==1) {
2215    owl_function_undeletecur(move_after);
2216    return NULL;
2217  }
2218
2219  if (argc==2 && !strcmp(argv[1], "view")) {
2220    owl_function_delete_curview_msgs(0);
2221    return NULL;
2222  }
2223
2224  if (argc==3 && (!strcmp(argv[1], "-id") || !strcmp(argv[1], "--id"))) {
2225    owl_function_delete_by_id(atoi(argv[2]), 0);
2226    return NULL;
2227  }
2228
2229  owl_function_makemsg("Unknown arguments to delete command");
2230  return NULL;
2231}
2232
2233void owl_command_beep()
2234{
2235  owl_function_beep();
2236}
2237
2238char *owl_command_colorview(int argc, char **argv, char *buff)
2239{
2240  if (argc!=2) {
2241    owl_function_makemsg("Wrong number of arguments to colorview command");
2242    return NULL;
2243  }
2244  owl_function_color_current_filter(argv[1]);
2245  return NULL;
2246}
2247
2248char *owl_command_colorclass(int argc, char **argv, char *buff)
2249{
2250  char *filtname;
2251 
2252  if (argc!=3) {
2253    owl_function_makemsg("Wrong number of arguments to colorclass command");
2254    return NULL;
2255  }
2256
2257  filtname=owl_function_classinstfilt(argv[1], NULL);
2258  (void) owl_function_color_filter(filtname, argv[2]);
2259  return NULL;
2260}
2261
2262char *owl_command_zpunt(int argc, char **argv, char *buff)
2263{
2264  owl_command_zpunt_and_zunpunt(argc, argv, 0);
2265  return NULL;
2266}
2267
2268char *owl_command_zunpunt(int argc, char **argv, char *buff)
2269{
2270  owl_command_zpunt_and_zunpunt(argc, argv, 1);
2271  return NULL;
2272}
2273
2274
2275void owl_command_zpunt_and_zunpunt(int argc, char **argv, int type)
2276{
2277  /* if type==0 then zpunt
2278   * if type==1 then zunpunt
2279   */
2280  char *class, *inst, *recip;
2281
2282  class="message";
2283  inst="";
2284  recip="*";
2285
2286  if (argc==1) {
2287    /* show current punt filters */
2288    owl_function_show_zpunts();
2289    return;
2290  } else if (argc==2) {
2291    inst=argv[1];
2292  } else if (argc==3) {
2293    class=argv[1];
2294    inst=argv[2];
2295  } else if (argc==4) {
2296    class=argv[1];
2297    inst=argv[2];
2298    recip=argv[3];
2299  } else {
2300    owl_function_makemsg("Wrong number of arguments to the zpunt command");
2301    return;
2302  }
2303
2304  owl_function_zpunt(class, inst, recip, type);
2305  if (type==0) {
2306    owl_function_makemsg("<%s, %s, %s> added to punt list.", class, inst, recip);
2307  } else if (type==1) {
2308    owl_function_makemsg("<%s, %s, %s> removed from punt list.", class, inst, recip);
2309  }
2310}
2311
2312char *owl_command_smartzpunt(int argc, char **argv, char *buff)
2313{
2314  if (argc == 1) {
2315    owl_function_smartzpunt(0);
2316  } else if (argc == 2 && (!strcmp(argv[1], "-i") || !strcmp(argv[1], "--instance"))) {
2317    owl_function_smartzpunt(1);
2318  } else {
2319    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);   
2320  }
2321  return NULL;
2322}
2323
2324char *owl_command_getview(int argc, char **argv, char *buff)
2325{
2326  char *filtname;
2327  if (argc != 1) {
2328    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);
2329    return NULL;
2330  }
2331  filtname = owl_view_get_filtname(owl_global_get_current_view(&g));
2332  if (filtname) filtname = owl_strdup(filtname);
2333  return filtname;
2334}
2335
2336char *owl_command_getvar(int argc, char **argv, char *buff)
2337{
2338  char tmpbuff[1024];
2339  if (argc != 2) {
2340    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);
2341    return NULL;
2342  }
2343  if (owl_variable_get_tostring(owl_global_get_vardict(&g), 
2344                                argv[1], tmpbuff, 1024)) {
2345    return NULL;
2346  }
2347  return owl_strdup(tmpbuff); 
2348}
2349
2350char *owl_command_search(int argc, char **argv, char *buff)
2351{
2352  int direction;
2353  char *buffstart;
2354
2355  direction=OWL_DIRECTION_DOWNWARDS;
2356  buffstart=skiptokens(buff, 1);
2357  if (argc>1 && !strcmp(argv[1], "-r")) {
2358    direction=OWL_DIRECTION_UPWARDS;
2359    buffstart=skiptokens(buff, 2);
2360  }
2361   
2362  if (argc==1 || (argc==2 && !strcmp(argv[1], "-r"))) {
2363    owl_function_search_continue(direction);
2364  } else {
2365    owl_function_search_start(buffstart, direction);
2366  }
2367 
2368  return(NULL);
2369}
2370
2371char *owl_command_aimlogin(int argc, char **argv, char *buff)
2372{
2373  if ((argc<2) || (argc>3)) {
2374    owl_function_makemsg("Wrong number of arguments to aimlogin command");
2375    return(NULL);
2376  }
2377
2378  /* if we get two arguments, ask for the password */
2379  if (argc==2) {
2380    owl_global_set_buffercommand(&g, argv[1]);
2381    owl_global_set_buffercallback(&g, &owl_callback_aimlogin);
2382    owl_function_start_password("AIM Password: ");
2383    return(NULL);
2384  } else {
2385    owl_function_aimlogin(argv[1], argv[2]);
2386  }
2387
2388  /* this is a test */
2389  return(NULL);
2390}
2391
2392char *owl_command_aimlogout(int argc, char **argv, char *buff)
2393{
2394  /* clear the buddylist */
2395  owl_buddylist_clear(owl_global_get_buddylist(&g));
2396
2397  owl_aim_logout();
2398  return(NULL);
2399}
2400
2401char *owl_command_getstyle(int argc, char **argv, char *buff)
2402{
2403  char *stylename;
2404  if (argc != 1) {
2405    owl_function_makemsg("Wrong number of arguments for %s", argv[0]);
2406    return NULL;
2407  }
2408  stylename = owl_view_get_style_name(owl_global_get_current_view(&g));
2409  if (stylename) stylename = owl_strdup(stylename);
2410  return stylename;
2411}
2412
2413/*********************************************************************/
2414/************************** EDIT SPECIFIC ****************************/
2415/*********************************************************************/
2416
2417void owl_command_edit_cancel(owl_editwin *e)
2418{
2419  owl_history *hist;
2420
2421  owl_function_makemsg("Command cancelled.");
2422
2423  hist=owl_editwin_get_history(e);
2424  owl_history_store(hist, owl_editwin_get_text(e));
2425  owl_history_reset(hist);
2426
2427  owl_editwin_fullclear(e);
2428  owl_global_set_needrefresh(&g);
2429  wnoutrefresh(owl_editwin_get_curswin(e));
2430  owl_global_set_typwin_inactive(&g);
2431  owl_editwin_new_style(e, OWL_EDITWIN_STYLE_ONELINE, NULL);
2432
2433  owl_function_activate_keymap("recv");
2434}
2435
2436void owl_command_edit_history_prev(owl_editwin *e)
2437{
2438  owl_history *hist;
2439  char *ptr;
2440
2441  hist=owl_editwin_get_history(e);
2442  if (!owl_history_is_touched(hist)) {
2443    owl_history_store(hist, owl_editwin_get_text(e));
2444    owl_history_set_partial(hist);
2445  }
2446  ptr=owl_history_get_prev(hist);
2447  if (ptr) {
2448    owl_editwin_clear(e);
2449    owl_editwin_insert_string(e, ptr);
2450    owl_editwin_redisplay(e, 0);
2451    owl_global_set_needrefresh(&g);
2452  } else {
2453    owl_function_beep();
2454  }
2455}
2456
2457void owl_command_edit_history_next(owl_editwin *e)
2458{
2459  owl_history *hist;
2460  char *ptr;
2461
2462  hist=owl_editwin_get_history(e);
2463  ptr=owl_history_get_next(hist);
2464  if (ptr) {
2465    owl_editwin_clear(e);
2466    owl_editwin_insert_string(e, ptr);
2467    owl_editwin_redisplay(e, 0);
2468    owl_global_set_needrefresh(&g);
2469  } else {
2470    owl_function_beep();
2471  }
2472}
2473
2474char *owl_command_edit_insert_text(owl_editwin *e, int argc, char **argv, char *buff)
2475{
2476  buff = skiptokens(buff, 1);
2477  owl_editwin_insert_string(e, buff);
2478  owl_editwin_redisplay(e, 0);
2479  owl_global_set_needrefresh(&g); 
2480  return NULL;
2481}
2482
2483void owl_command_editline_done(owl_editwin *e)
2484{
2485  owl_history *hist=owl_editwin_get_history(e);
2486  char *rv, *cmd;
2487
2488  owl_history_store(hist, owl_editwin_get_text(e));
2489  owl_history_reset(hist);
2490  owl_global_set_typwin_inactive(&g);
2491  cmd = owl_strdup(owl_editwin_get_text(e));
2492  owl_editwin_fullclear(e);
2493  rv = owl_function_command(cmd);
2494  owl_free(cmd);
2495
2496  wnoutrefresh(owl_editwin_get_curswin(e));
2497  owl_global_set_needrefresh(&g);
2498
2499  if (rv) {
2500    owl_function_makemsg("%s", rv);
2501    owl_free(rv);
2502  }
2503}
2504
2505
2506void owl_command_editresponse_done(owl_editwin *e)
2507{
2508  owl_global_set_response(&g, owl_editwin_get_text(e));
2509
2510  owl_global_set_typwin_inactive(&g);
2511  owl_editwin_fullclear(e);
2512  wnoutrefresh(owl_editwin_get_curswin(e));
2513  owl_global_set_needrefresh(&g);
2514
2515  owl_function_run_buffercommand();
2516}
2517
2518
2519void owl_command_editmulti_done(owl_editwin *e)
2520{
2521  owl_history *hist=owl_editwin_get_history(e);
2522
2523  owl_history_store(hist, owl_editwin_get_text(e));
2524  owl_history_reset(hist);
2525
2526  owl_function_run_buffercommand();
2527  owl_editwin_new_style(e, OWL_EDITWIN_STYLE_ONELINE, NULL);
2528  owl_editwin_fullclear(e);
2529  owl_global_set_typwin_inactive(&g);
2530  owl_global_set_needrefresh(&g);
2531  wnoutrefresh(owl_editwin_get_curswin(e));
2532}
2533
2534void owl_command_editmulti_done_or_delete(owl_editwin *e)
2535{
2536  if (owl_editwin_is_at_end(e)) {
2537    owl_command_editmulti_done(e);
2538  } else {
2539    owl_editwin_delete_char(e);
2540  }
2541}
2542
2543
2544/*********************************************************************/
2545/*********************** POPLESS SPECIFIC ****************************/
2546/*********************************************************************/
2547
2548void owl_command_popless_quit(owl_viewwin *vw)
2549{
2550  owl_popwin_close(owl_global_get_popwin(&g));
2551  owl_viewwin_free(vw);
2552  owl_global_set_needrefresh(&g);
2553}
Note: See TracBrowser for help on using the repository browser.