source: commands.c @ 25b5b4b

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