[1159] in BarnOwl Developers

home help back first fref pref prev next nref lref last post

[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:


home help back first fref pref prev next nref lref last post