[1159] in BarnOwl Developers
[D-O-H] r1107 - trunk/owl
daemon@ATHENA.MIT.EDU (nelhage@MIT.EDU)
Thu Oct 29 18:13:37 2009
Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
X-Original-To: nelhage@nelhage.com
To: dirty-owl-hackers@MIT.EDU
From: nelhage@MIT.EDU
Reply-to: dirty-owl-hackers@MIT.EDU
Date: Thu, 21 Aug 2008 00:52:05 -0400 (EDT)
Author: nelhage
Date: 2008-08-21 00:52:04 -0400 (Thu, 21 Aug 2008)
New Revision: 1107
Modified:
trunk/owl/cmd.c
trunk/owl/functions.c
trunk/owl/perlconfig.c
trunk/owl/perlglue.xs
Log:
Make BarnOwl::command() accept a pre-tokenized command.
If given more than one argument, BarnOwl::command now treats the
arguments as an argv list to execute the command with. Previously it
only accepted a single argument, so this should not change the
behavior of any existing code.
Modified: trunk/owl/cmd.c
===================================================================
--- trunk/owl/cmd.c 2008-08-20 21:05:46 UTC (rev 1106)
+++ trunk/owl/cmd.c 2008-08-21 04:52:04 UTC (rev 1107)
@@ -66,12 +66,24 @@
return owl_dict_insert_element(cd, newcmd->name, (void*)newcmd, (void(*)(void*))owl_cmd_free);
}
+char *_owl_cmddict_execute(owl_cmddict *cd, owl_context *ctx, char **argv, int argc, char *buff) {
+ char *retval = NULL;
+ owl_cmd *cmd;
+
+ if (!strcmp(argv[0], "")) {
+ } else if (NULL != (cmd = (owl_cmd*)owl_dict_find_element(cd, argv[0]))) {
+ retval = owl_cmd_execute(cmd, cd, ctx, argc, argv, buff);
+ } else {
+ owl_function_makemsg("Unknown command '%s'.", buff);
+ }
+ return retval;
+}
+
char *owl_cmddict_execute(owl_cmddict *cd, owl_context *ctx, char *cmdbuff) {
char **argv;
int argc;
char *tmpbuff;
char *retval = NULL;
- owl_cmd *cmd;
tmpbuff=owl_strdup(cmdbuff);
argv=owl_parseline(tmpbuff, &argc);
@@ -84,18 +96,38 @@
if (argc < 1) return(NULL);
- if (!strcmp(argv[0], "")) {
- } else if (NULL != (cmd = (owl_cmd*)owl_dict_find_element(cd, argv[0]))) {
- retval = owl_cmd_execute(cmd, cd, ctx, argc, argv, cmdbuff);
- } else {
- owl_function_makemsg("Unknown command '%s'.", cmdbuff);
- }
+ retval = _owl_cmddict_execute(cd, ctx, argv, argc, cmdbuff);
+
owl_parsefree(argv, argc);
owl_free(tmpbuff);
sepbar(NULL);
return retval;
}
+char *owl_cmddict_execute_argv(owl_cmddict *cd, owl_context *ctx, char **argv, int argc) {
+ char *buff, *ptr;
+ int len = 0, i;
+ char *retval = NULL;
+
+ for(i = 0; i < argc; i++) {
+ len += strlen(argv[i]) + 1;
+ }
+
+ ptr = buff = owl_malloc(len);
+
+ for(i = 0; i < argc; i++) {
+ strcpy(ptr, argv[i]);
+ ptr += strlen(argv[i]);
+ *(ptr++) = ' ';
+ }
+ *(ptr - 1) = 0;
+
+ retval = _owl_cmddict_execute(cd, ctx, argv, argc, buff);
+
+ owl_free(buff);
+ return retval;
+}
+
/*********************************************************************/
/***************************** COMMAND *******************************/
/*********************************************************************/
Modified: trunk/owl/functions.c
===================================================================
--- trunk/owl/functions.c 2008-08-20 21:05:46 UTC (rev 1106)
+++ trunk/owl/functions.c 2008-08-21 04:52:04 UTC (rev 1107)
@@ -26,6 +26,13 @@
owl_global_get_context(&g), cmdbuff);
}
+char *owl_function_command_argv(char **argv, int argc)
+{
+ return owl_cmddict_execute_argv(owl_global_get_cmddict(&g),
+ owl_global_get_context(&g),
+ argv, argc);
+}
+
void owl_function_command_norv(char *cmdbuff)
{
char *rv;
Modified: trunk/owl/perlconfig.c
===================================================================
--- trunk/owl/perlconfig.c 2008-08-20 21:05:46 UTC (rev 1106)
+++ trunk/owl/perlconfig.c 2008-08-21 04:52:04 UTC (rev 1107)
@@ -180,7 +180,8 @@
char *owl_perlconfig_call_with_message(char *subname, owl_message *m)
{
dSP ;
- int count, len;
+ int count;
+ unsigned int len;
SV *msgref, *srv;
char *out, *preout;
@@ -456,7 +457,7 @@
if(SvTRUE(ERRSV)) {
owl_function_error("%s", SvPV(ERRSV, n_a));
- POPs;
+ (void)POPs;
} else {
if(count != 1)
croak("Perl command %s returned more than one value!", cmd->name);
Modified: trunk/owl/perlglue.xs
===================================================================
--- trunk/owl/perlglue.xs 2008-08-20 21:05:46 UTC (rev 1106)
+++ trunk/owl/perlglue.xs 2008-08-21 04:52:04 UTC (rev 1107)
@@ -16,7 +16,7 @@
* NOTE
*************************************************************
* These functions, when they are intended to be user-visible,
- * are document in perlwrap.pm. If you add functions to this
+ * are documented in perlwrap.pm. If you add functions to this
* file, add the appropriate documentation there!
*
* If the function is simple enough, we simply define its
@@ -32,13 +32,27 @@
MODULE = BarnOwl PACKAGE = BarnOwl
char *
-command(cmd)
+command(cmd, ...)
char *cmd
PREINIT:
char *rv = NULL;
+ char **argv;
+ int i;
CODE:
- rv = owl_function_command(cmd);
- RETVAL = rv;
+ {
+ if (items == 1) {
+ rv = owl_function_command(cmd);
+ } else {
+ argv = owl_malloc((items + 1) * sizeof *argv);
+ argv[0] = cmd;
+ for(i = 1; i < items; i++) {
+ argv[i] = SvPV_nolen(ST(i));
+ }
+ rv = owl_function_command_argv(argv, items);
+ owl_free(argv);
+ }
+ RETVAL = rv;
+ }
OUTPUT:
RETVAL
CLEANUP: