Index: trunk/Ohana/src/opihi/lib.shell/command.c
===================================================================
--- trunk/Ohana/src/opihi/lib.shell/command.c	(revision 4448)
+++ trunk/Ohana/src/opihi/lib.shell/command.c	(revision 4462)
@@ -2,13 +2,9 @@
 # define VERBOSE 0
 
-static int Ncalls = 0;
-
 int command (char *line, char **outline) {
 
-  int i, status, argc, targc;
-  char **argv, **targv;
+  int i, status, argc;
+  char **argv;
   Command *cmd;
-
-  Ncalls ++;
 
   /* force a space between ! and first word: !ls becomes ! ls */
@@ -26,63 +22,30 @@
   line = parse (line);        /* line is freed here, new one allocated */
   /* any entry in line of the form {foo} returns value or tmp vector / buffer */
+
+  /* we may have reallocated line, return new pointer */
+  *outline = line;
   
-  targv = parse_commands (line, &targc);
-  if (targc == 0) {
-    /* empty command or assignment */
-    if (line != (char *) NULL) free (line);
-    *outline = (char *) NULL;
-    return (TRUE);
+  argv = parse_commands (line, &argc);
+  if (argc == 0) return (TRUE);  /* empty command or assignment */
+
+  cmd = MatchCommand (argv[0], TRUE, FALSE);
+  if (cmd == NULL) {
+    status = FALSE;
+  } else {
+    free (argv[0]);
+    argv[0] = strcreate (cmd[0].name);
+    status = (*cmd[0].func) (argc, argv);
+  }
+  for (i = 0; i < argc; i++) free (argv[i]);
+  free (argv);
+
+  if (!status) {
+    char *msg;
+    msg = get_variable_ptr ("ERRORMSG");
+    if (msg != (char *) NULL) fprintf (stderr, "%s\n", msg);
   }
 
-  /* this needs some work to use multicommand correctly */
-  /* allocate extra space to have null terminated list */
-  ALLOCATE (argv, char *, targc + 1); 
-  argc = 0;
-  status = TRUE;
-  for (i = 0; status && (i < targc); i++) {
-    if (targv[i][0] != ';') {
-      argv[argc] = targv[i];
-      argc ++;
-    }
-    if ((targv[i][0] == ';') || (i == targc - 1)) {
-
-      if (argc == 0) continue;
-      argv[argc] = 0;
-
-      /* i +> argc + 1, argv[argc-1] = targv[i] 
-       * argv[n] = argv[argc - 1 - argc + 1 + n] = targv[i - argc + 1 + n] 
-       */
-
-      cmd = MatchCommand (argv[0], TRUE, FALSE);
-      if (cmd != NULL) {
-	REALLOCATE (argv[0], char, strlen(cmd[0].name) + 1);
-	targv[i-argc+1] = argv[0];  /* need to keep ptr in sync */
-	strcpy (argv[0], cmd[0].name);
-	status &= (*cmd[0].func) (argc, argv);
-	if (auto_break && !status) break;
-      }
-      argc = 0;
-    }
-  }
-  for (i = 0; i < targc; i++) free (targv[i]);
-  free (argv);
-  free (targv);
-  *outline = line;
-  if (!status) {
-    char *msg;
-    msg = get_variable ("ERRORMSG");
-    if (msg != (char *) NULL) {
-      fprintf (stderr, "%s\n", msg);
-      free (msg);
-    }
-  }
   set_int_variable ("STATUS", status);
   if (VERBOSE) fprintf (stderr, "command: %s, status: %d\n", line, status);
   return (status);
-
 }
-
-void print_ncalls () {
-  fprintf (stderr, "Ncalls to command(): %d\n", Ncalls);
-}
-
