* sim/ucsim/cmd.src/newcmdposix.cc, sim/ucsim/cmd.src/newcmdposixcl.h,
[fw/sdcc] / sim / ucsim / cmd.src / command.cc
index e58a225118a3a6ed9476154613b3ff84cd53b54e..cdd40a584d8c54405fd4190a415d5497f4fc36dd 100644 (file)
@@ -42,13 +42,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
  */
 
 cl_cmdline::cl_cmdline(class cl_app *the_app,
-                      char *acmd, class cl_console *acon):
+                       char *acmd, class cl_console_base *acon):
   cl_base()
 {
   app= the_app;
   cmd= strdup(acmd);
-  params= new cl_list(2, 2);
-  tokens= new cl_ustrings(2, 2);
+  params= new cl_list(2, 2, "command line params");
+  tokens= new cl_ustrings(2, 2, "command line tokens");
   set_name(0);
   matched_syntax= 0;
   con= acon;
@@ -73,7 +73,7 @@ char *
 cl_cmdline::skip_delims(char *start)
 {
   while (*start &&
-        strchr(" \t\v\r,", *start))
+         strchr(" \t\v\r,", *start))
     start++;
   return(start);
 }
@@ -87,7 +87,7 @@ cl_cmdline::split(void)
   class cl_cmd_arg *arg;
 
   //sim= app->get_sim();
-  set_name(0);
+  set_name("\n");
   if (!cmd ||
       !*cmd)
     return(0);
@@ -115,190 +115,211 @@ cl_cmdline::split(void)
   // skip delimiters
   while (*start)
     {
-      char *end, *param_str;
+      char *end= start, *param_str;
       if (*start == '"')
-       {
-         // string
-         start++;
-         end= start;
-         while (*end &&
-                *end != '"')
-           {
-             if (*end == '\\')
-               {
-                 end++;
-                 if (*end)
-                   end++;
-               }
-             else
-               end++;
-           }
-         if (*end == '"')
-           end--;
-         else
-           con->dd_printf("Unterminated string\n");
-         param_str= (char *)malloc(end-start+2);
-         strncpy(param_str, start, 1+end-start);
-         param_str[1+end-start]= '\0';
-         tokens->add(strdup(param_str));
-         params->add(arg= new cl_cmd_str_arg(param_str));
-         arg->init();
-         free(param_str);
-         if (*end)
-           end++;
-         if (*end == '"')
-           end++;
-       }
+        split_out_string(&start, &end);
+      else if (*start == '>')
+        split_out_output_redirection(&start, &end);
       else
-       {
-         char *dot;
-         i= strcspn(start, " \t\v\r,");
-         end= start+i;
-         param_str= (char *)malloc(i+1);
-         strncpy(param_str, start, i);
-         param_str[i]= '\0';
-         if (strchr(">", *start))
-           {
-             char *fn, mode[3]= "w\0";
-             switch (*start)
-               {
-               case '>':
-                 if (i == 1 ||
-                     (i == 2 &&
-                      start[1] == '>')) {
-                   con->dd_printf("Unspecified redirection\n");
-                   break;
-                 }
-                 fn= start+1;
-                 if (*fn == '>') {
-                   fn++;
-                   mode[0]= 'a';
-                 }
-                 con->redirect(fn, mode);
-                 break;
-               default:
-                 break;
-               }
-             free(param_str);
-             start= end;
-             start= skip_delims(start);
-             continue;
-           }
-         tokens->add(strdup(param_str));
-         if ((dot= strchr(param_str, '.')) != NULL)
-           {
-             // bit
-             class cl_cmd_arg *sfr, *bit;
-             *dot= '\0';
-             dot++;
-             if (strchr("0123456789", *param_str) != NULL)
-               {
-                 sfr= new cl_cmd_int_arg((long)strtol(param_str, 0, 0));
-                 sfr->init();
-               }
-             else
-               {
-                 sfr= new cl_cmd_sym_arg(param_str);
-                 sfr->init();
-               }
-             if (*dot == '\0')
-               {
-                 bit= 0;
-                 con->dd_printf("Uncomplete bit address\n");
-                 delete sfr;
-               }
-             else
-               {
-                 if (strchr("0123456789", *dot) != NULL)
-                   {
-                     bit= new cl_cmd_int_arg((long)strtol(dot, 0, 0));
-                     bit->init();
-                   }
-                 else
-                   {
-                     bit= new cl_cmd_sym_arg(dot);
-                     bit->init();
-                   }
-                 params->add(arg= new cl_cmd_bit_arg(sfr, bit));
-                 arg->init();
-               }
-           }
-         else if ((dot= strchr(param_str, '[')) != NULL)
-           {
-             // array
-             class cl_cmd_arg *aname, *aindex;
-             *dot= '\0';
-             dot++;
-             if (strchr("0123456789", *param_str) != NULL)
-               {
-                 aname= new cl_cmd_int_arg((long)strtol(param_str, 0, 0));
-                 aname->init();
-               }
-             else
-               {
-                 aname= new cl_cmd_sym_arg(param_str);
-                 aname->init();
-               }
-             if (*dot == '\0')
-               {
-                 aname= 0;
-                 con->dd_printf("Uncomplete array\n");
-               }
-             else
-               {
-                 char *p;
-                 p= dot + strlen(dot) - 1;
-                 while (p > dot &&
-                        *p != ']')
-                   {
-                     *p= '\0';
-                     p--;
-                   }
-                 if (*p == ']')
-                   *p= '\0';
-                 if (strlen(dot) == 0)
-                   {
-                     con->dd_printf("Uncomplete array index\n");
-                     delete aname;
-                   }
-                 else    
-                   {
-                     if (strchr("0123456789", *dot) != NULL)
-                       {
-                         aindex= new cl_cmd_int_arg((long)strtol(dot, 0, 0));
-                         aindex->init();
-                       }
-                     else
-                       {
-                         aindex= new cl_cmd_sym_arg(dot);
-                         aindex->init();
-                       }
-                     params->add(arg= new cl_cmd_array_arg(aname, aindex));
-                     arg->init();
-                   }
-               }
-           }
-         else if (strchr("0123456789", *param_str) != NULL)
-           {
-             // number
-             params->add(arg= new cl_cmd_int_arg((long)
-                                                 strtol(param_str, 0, 0)));
-             arg->init();
-           }
-         else
-           {
-             // symbol
-             params->add(arg= new cl_cmd_sym_arg(param_str));
-             arg->init();
-           }
-         free(param_str);
-       }
+        {
+          char *dot;
+          i= strcspn(start, " \t\v\r,");
+          end= start+i;
+          param_str= (char *)malloc(i+1);
+          strncpy(param_str, start, i);
+          param_str[i]= '\0';
+          tokens->add(strdup(param_str));
+          if ((dot= strchr(param_str, '.')) != NULL)
+            split_out_bit(dot, param_str);
+          else if ((dot= strchr(param_str, '[')) != NULL)
+            split_out_array(dot, param_str);
+          else if (strchr("0123456789-+", *param_str) != NULL)
+            {
+              // number
+              params->add(arg= new cl_cmd_int_arg((long)
+                                                  strtol(param_str, 0, 0)));
+              arg->init();
+            }
+          else
+            {
+              // symbol
+              params->add(arg= new cl_cmd_sym_arg(param_str));
+              arg->init();
+            }
+          free(param_str);
+        }
       start= end;
       start= skip_delims(start);
     }
   return(0);
 }
 
+void
+cl_cmdline::split_out_string(char **_start, char **_end)
+{
+  char *start= *_start, *end;
+  start++;
+  end= start;
+  while (*end &&
+        *end != '"')
+    {
+      if (*end == '\\')
+       {
+         end++;
+         if (*end)
+           end++;
+       }
+      else
+       end++;
+    }
+  if (*end == '"')
+    end--;
+  else
+    con->dd_printf("Unterminated string\n");
+  char *param_str= (char *)malloc(end-start+2);
+  strncpy(param_str, start, 1+end-start);
+  param_str[1+end-start]= '\0';
+  tokens->add(strdup(param_str));
+  class cl_cmd_arg *arg;
+  params->add(arg= new cl_cmd_str_arg(param_str));
+  arg->init();
+  free(param_str);
+  if (*end)
+    end++;
+  if (*end == '"')
+    end++;
+  *_start= start;
+  *_end= end;
+}
+
+void
+cl_cmdline::split_out_output_redirection(char **_start, char **_end)
+{
+  char *start= *_start, *end/*= *_end*/;
+  int i;
+  char mode[2];
+
+  mode[0]= 'w';
+  mode[1]= '\0';
+  start++;
+  i= strcspn(start, " \t\v\r,");
+  end= start+i;
+  char *param_str= (char *)malloc(i+1);
+  char *n= param_str;
+  strncpy(param_str, start, i);
+  param_str[i]= '\0';
+  if (param_str &&
+      param_str[0] == '>')
+    {
+      n++;
+      mode[0]= 'a';
+    }
+  tokens->add(strdup(n));
+  con->redirect(n, mode);
+  free(param_str);
+  *_start= start;
+  *_end= end;
+}
+
+void
+cl_cmdline::split_out_bit(char *dot, char *param_str)
+{
+  class cl_cmd_arg *sfr, *bit;
+
+  *dot= '\0';
+  dot++;
+  if (strchr("0123456789", *param_str) != NULL)
+    {
+      sfr= new cl_cmd_int_arg((long)strtol(param_str, 0, 0));
+      sfr->init();
+    }
+  else
+    {
+      sfr= new cl_cmd_sym_arg(param_str);
+      sfr->init();
+    }
+  if (*dot == '\0')
+    {
+      bit= 0;
+      con->dd_printf("Uncomplete bit address\n");
+      delete sfr;
+    }
+  else
+    {
+      if (strchr("0123456789", *dot) != NULL)
+       {
+         bit= new cl_cmd_int_arg((long)strtol(dot, 0, 0));
+         bit->init();
+       }
+      else
+       {
+         bit= new cl_cmd_sym_arg(dot);
+         bit->init();
+       }
+      class cl_cmd_arg *arg;
+      params->add(arg= new cl_cmd_bit_arg(sfr, bit));
+      arg->init();
+    }
+}
+
+void
+cl_cmdline::split_out_array(char *dot, char *param_str)
+{
+  class cl_cmd_arg *aname, *aindex;
+       
+  *dot= '\0';
+  dot++;
+  if (strchr("0123456789", *param_str) != NULL)
+    {
+      aname= new cl_cmd_int_arg((long)strtol(param_str, 0, 0));
+      aname->init();
+    }
+  else
+    {
+      aname= new cl_cmd_sym_arg(param_str);
+      aname->init();
+    }
+  if (*dot == '\0')
+    {
+      aname= 0;
+      con->dd_printf("Uncomplete array\n");
+    }
+  else
+    {
+      char *p;
+      p= dot + strlen(dot) - 1;
+      while (p > dot &&
+            *p != ']')
+       {
+         *p= '\0';
+         p--;
+       }
+      if (*p == ']')
+       *p= '\0';
+      if (strlen(dot) == 0)
+       {
+         con->dd_printf("Uncomplete array index\n");
+         delete aname;
+       }
+      else    
+       {
+         if (strchr("0123456789", *dot) != NULL)
+           {
+             aindex= new cl_cmd_int_arg((long)strtol(dot, 0, 0));
+             aindex->init();
+           }
+         else
+           {
+             aindex= new cl_cmd_sym_arg(dot);
+             aindex->init();
+           }
+         class cl_cmd_arg *arg;
+         params->add(arg= new cl_cmd_array_arg(aname, aindex));
+         arg->init();
+       }
+    }
+}
+
 int
 cl_cmdline::shift(void)
 {
@@ -308,15 +329,17 @@ cl_cmdline::shift(void)
   if (s && *s)
     {
       while (*s &&
-            strchr(" \t\v\r,", *s) == NULL)
-       s++;
+             strchr(" \t\v\r,", *s) == NULL)
+        s++;
       s= skip_delims(s);
       char *p= strdup(s);
       free(cmd);
       cmd= p;
       delete params;
-      params= new cl_list(2, 2);
+      params= new cl_list(2, 2, "params");
       split();
+      if (strcmp(get_name(), "\n") == 0)
+        set_name(0);
     }
   return(have_real_name());
 }
@@ -326,7 +349,7 @@ cl_cmdline::repeat(void)
 {
   char *n;
   return((n= get_name()) &&
-        *n == '\n');
+         *n == '\n');
 }
 
 class cl_cmd_arg *
@@ -363,63 +386,60 @@ cl_cmdline::syntax_match(class cl_uc *uc, char *syntax)
   char *p= syntax;
   int iparam= 0;
   class cl_cmd_arg *parm= (class cl_cmd_arg *)(params->at(iparam));
-  bool match;
   while (*p &&
-        parm)
+         parm)
     {
-      //printf("Checking %s as %c\n",parm->get_svalue(),*p);
+      //printf("***Checking %s as %c\n",parm->get_svalue(),*p);
       if (uc)
-       switch (*p)
-         {
-         case SY_ADDR:
-           match= parm->as_address(uc);
-           if (!match)
-             return(match);
-           //printf("ADDRESS match %lx\n",parm->value.address);
-           break;
-         case SY_MEMORY:
-           match= parm->as_memory(uc);
-           if (!match)
-             return(DD_FALSE);
-           //printf("MEMORY match %s\n",parm->value.memory->class_name);
-           break;
-         case SY_BIT:
-           if (!parm->as_bit(uc))
-             return(DD_FALSE);
-           break;
-         }
+        switch (*p)
+          {
+          case SY_ADDR:
+            if (!parm->as_address(uc))
+              return(DD_FALSE);
+            //printf("ADDRESS match %lx\n",parm->value.address);
+            break;
+          case SY_MEMORY:
+            if (!parm->as_memory(uc))
+              return(DD_FALSE);
+            //printf("MEMORY match %s\n",parm->value.memory->class_name);
+            break;
+          case SY_BIT:
+            if (!parm->as_bit(uc))
+              return(DD_FALSE);
+            break;
+          }
       switch (*p)
-       {
-       case SY_ADDR: case SY_MEMORY: case SY_BIT: break;
-       case SY_NUMBER:
-         if (!parm->as_number())
-           return(DD_FALSE);
-         break;
-       case SY_DATA:
-         if (!parm->as_data())
-           return(DD_FALSE);
-         break;
-       case SY_HW:
-         if (!parm->as_hw(uc))
-           return(DD_FALSE);
-         break;
-       case SY_STRING:
-         if (!parm->as_string())
-           return(DD_FALSE);
-         break;
-       case SY_DATALIST:
-         if (!set_data_list(parm, &iparam))
-           return(DD_FALSE);
-         break;
-       default:
-         return(DD_FALSE);
-       }
+        {
+        case SY_ADDR: case SY_MEMORY: case SY_BIT: break;
+        case SY_NUMBER:
+          if (!parm->as_number())
+            return(DD_FALSE);
+          break;
+        case SY_DATA:
+          if (!parm->as_data())
+            return(DD_FALSE);
+          break;
+        case SY_HW:
+          if (!parm->as_hw(uc))
+            return(DD_FALSE);
+          break;
+        case SY_STRING:
+          if (!parm->as_string())
+            return(DD_FALSE);
+          break;
+        case SY_DATALIST:
+          if (!set_data_list(parm, &iparam))
+            return(DD_FALSE);
+          break;
+        default:
+          return(DD_FALSE);
+        }
       p++;
       iparam++;
       if (iparam < params->count)
-       parm= (class cl_cmd_arg *)(params->at(iparam));
+        parm= (class cl_cmd_arg *)(params->at(iparam));
       else
-       parm= 0;
+        parm= 0;
     }
   if (!*p &&
       !parm)
@@ -442,41 +462,41 @@ cl_cmdline::set_data_list(class cl_cmd_arg *parm, int *iparm)
   for (i= *iparm, next_parm= param(i); next_parm; i++, next_parm= param(i))
     {
       if (next_parm->is_string())
-       {
-         int l;
-         char *s;
-         //s= proc_escape(next_parm->get_svalue(), &l);
-         if (!next_parm->as_string())
-           continue;
-         s= next_parm->value.string.string;
-         l= next_parm->value.string.len;
-         if (!array)
-           array= (t_mem*)malloc(sizeof(t_mem)*l);
-         else
-           array= (t_mem*)realloc(array, sizeof(t_mem)*(l+len));
-         for (j= 0; j < l; j++)
-           {
-             array[len]= s[j];
-             len++;
-           }
-         //if (s)
-         //free(s);
-       }
+        {
+          int l;
+          char *s;
+          //s= proc_escape(next_parm->get_svalue(), &l);
+          if (!next_parm->as_string())
+            continue;
+          s= next_parm->value.string.string;
+          l= next_parm->value.string.len;
+          if (!array)
+            array= (t_mem*)malloc(sizeof(t_mem)*l);
+          else
+            array= (t_mem*)realloc(array, sizeof(t_mem)*(l+len));
+          for (j= 0; j < l; j++)
+            {
+              array[len]= s[j];
+              len++;
+            }
+          //if (s)
+          //free(s);
+        }
       else
-       {
-         if (!next_parm->as_data())
-           {
-             if (array)
-               free(array);
-             return(DD_FALSE);
-           }
-         if (!array)
-           array= (t_mem*)malloc(sizeof(t_mem));
-         else
-           array= (t_mem*)realloc(array, sizeof(t_mem)*(1+len));
-         array[len]= next_parm->value.data;
-         len++;
-       }
+        {
+          if (!next_parm->as_data())
+            {
+              if (array)
+                free(array);
+              return(DD_FALSE);
+            }
+          if (!array)
+            array= (t_mem*)malloc(sizeof(t_mem));
+          else
+            array= (t_mem*)realloc(array, sizeof(t_mem)*(1+len));
+          array[len]= next_parm->value.data;
+          len++;
+        }
     }
   *iparm= i;
   parm->value.data_list.array= array;
@@ -491,14 +511,14 @@ cl_cmdline::set_data_list(class cl_cmd_arg *parm, int *iparm)
  */
 
 cl_cmd::cl_cmd(enum cmd_operate_on op_on,
-              char *aname,
-              int can_rep,
-              char *short_hlp,
-              char *long_hlp):
+               char *aname,
+               int can_rep,
+               char *short_hlp,
+               char *long_hlp):
   cl_base()
 {
   operate_on= op_on;
-  names= new cl_strings(1, 1);
+  names= new cl_strings(1, 1, "names of a command");
   names->add(aname?strdup(aname):strdup("unknown"));
   can_repeat= can_rep;
   short_help= short_hlp?strdup(short_hlp):NULL;
@@ -542,20 +562,20 @@ cl_cmd::name_match(char *aname, int strict)
   if (strict)
     {
       for (i= 0; i < names->count; i++)
-       {
-         char *n= (char*)(names->at(i));
-         if (strcmp(aname, n) == 0)
-           return(1);
-       }
+        {
+          char *n= (char*)(names->at(i));
+          if (strcmp(aname, n) == 0)
+            return(1);
+        }
     }
   else
     {
       for (i= 0; i < names->count; i++)
-       {
-         char *n= (char*)(names->at(i));
-         if (strstr(n, aname) == n)
-           return(1);
-       }
+        {
+          char *n= (char*)(names->at(i));
+          if (strstr(n, aname) == n)
+            return(1);
+        }
     }
   return(0);
 }
@@ -574,7 +594,7 @@ cl_cmd::syntax_ok(class cl_cmdline *cmdline)
 
 int
 cl_cmd::work(class cl_app *app,
-            class cl_cmdline *cmdline, class cl_console *con)
+             class cl_cmdline *cmdline, class cl_console_base *con)
 {
   if (!syntax_ok(cmdline))
     return(0);
@@ -586,24 +606,24 @@ cl_cmd::work(class cl_app *app,
     {
     case operate_on_app:
       if (!app)
-       {
-         con->dd_printf("There is no application to work on!\n");
-         return(DD_TRUE);
-       }
+        {
+          con->dd_printf("There is no application to work on!\n");
+          return(DD_TRUE);
+        }
       return(do_work(app, cmdline, con));
     case operate_on_sim:
       if (!sim)
-       {
-         con->dd_printf("There is no simulator to work on!\n");
-         return(DD_TRUE);
-       }
+        {
+          con->dd_printf("There is no simulator to work on!\n");
+          return(DD_TRUE);
+        }
       return(do_work(sim, cmdline, con));
     case operate_on_uc:
       if (!sim)
-       {
-         con->dd_printf("There is no microcontroller to work on!\n");
-         return(DD_TRUE);
-       }
+        {
+          con->dd_printf("There is no microcontroller to work on!\n");
+          return(DD_TRUE);
+        }
       return(do_work(uc, cmdline, con));
     default:
       return(do_work(cmdline, con));
@@ -611,37 +631,37 @@ cl_cmd::work(class cl_app *app,
 }
 
 int
-cl_cmd::do_work(class cl_cmdline *cmdline, class cl_console *con)
+cl_cmd::do_work(class cl_cmdline *cmdline, class cl_console_base *con)
 {
   con->dd_printf("Command \"%s\" does nothing.\n",
-                (char*)(names->at(0)));
+                 (char*)(names->at(0)));
   return(0);
 }
 
 int
 cl_cmd::do_work(class cl_app *app,
-               class cl_cmdline *cmdline, class cl_console *con)
+                class cl_cmdline *cmdline, class cl_console_base *con)
 {
   con->dd_printf("Command \"%s\" does nothing on application.\n",
-                (char*)(names->at(0)));
+                 (char*)(names->at(0)));
   return(0);
 }
 
 int
 cl_cmd::do_work(class cl_sim *sim,
-               class cl_cmdline *cmdline, class cl_console *con)
+                class cl_cmdline *cmdline, class cl_console_base *con)
 {
   con->dd_printf("Command \"%s\" does nothing on simulator.\n",
-                (char*)(names->at(0)));
+                 (char*)(names->at(0)));
   return(0);
 }
 
 int
 cl_cmd::do_work(class cl_uc *uc,
-               class cl_cmdline *cmdline, class cl_console *con)
+                class cl_cmdline *cmdline, class cl_console_base *con)
 {
   con->dd_printf("Command \"%s\" does nothing on microcontroller.\n",
-                (char*)(names->at(0)));
+                 (char*)(names->at(0)));
   return(0);
 }
 
@@ -652,10 +672,10 @@ cl_cmd::do_work(class cl_uc *uc,
  */
 
 cl_cmdset::cl_cmdset(void):
-  cl_list(5, 5)
+  cl_list(5, 5, "cmdset")
 {
   //sim= 0;
-  last_command= 0;
+  //last_command= 0;
 }
 
 /*cl_cmdset::cl_cmdset(class cl_sim *asim):
@@ -666,23 +686,16 @@ cl_cmdset::cl_cmdset(void):
 }*/
 
 class cl_cmd *
-cl_cmdset::get_cmd(class cl_cmdline *cmdline)
+cl_cmdset::get_cmd(class cl_cmdline *cmdline, bool accept_last)
 {
   int i;
 
-  if (cmdline->repeat())
-    {
-      if (last_command)
-       return(last_command);
-      else
-       return(0);
-    }
   // exact match
   for (i= 0; i < count; i++)
     {
       class cl_cmd *c= (class cl_cmd *)at(i);
       if (c->name_match(cmdline, 1))
-       return(c);
+        return(c);
     }
   // not exact match
   class cl_cmd *c_matched= 0;
@@ -690,12 +703,12 @@ cl_cmdset::get_cmd(class cl_cmdline *cmdline)
     {
       class cl_cmd *c= (class cl_cmd *)at(i);
       if (c->name_match(cmdline, 0))
-       {
-         if (!c_matched)
-           c_matched= c;
-         else
-           return(0);
-       }
+        {
+          if (!c_matched)
+            c_matched= c;
+          else
+            return(0);
+        }
     }
   return(c_matched);
   //return(0);
@@ -710,7 +723,7 @@ cl_cmdset::get_cmd(char *cmd_name)
     {
       class cl_cmd *c= (class cl_cmd *)at(i);
       if (c->name_match(cmd_name, 1))
-       return(c);
+        return(c);
     }
   return(0);
 }
@@ -726,7 +739,7 @@ cl_cmdset::del(char *nam)
     {
       class cl_cmd *cmd= (class cl_cmd *)(at(i));
       if (cmd->name_match(nam, 1))
-       free_at(i);
+        free_at(i);
     }
 }
 
@@ -741,10 +754,10 @@ cl_cmdset::replace(char *nam, class cl_cmd *cmd)
     {
       class cl_cmd *c= (class cl_cmd *)(at(i));
       if (c->name_match(nam, 1))
-       {
-         delete c;
-         put_at(i, cmd);
-       }
+        {
+          delete c;
+          put_at(i, cmd);
+        }
     }
 }
 
@@ -755,10 +768,10 @@ cl_cmdset::replace(char *nam, class cl_cmd *cmd)
  */
 
 cl_super_cmd::cl_super_cmd(char *aname,
-                          int  can_rep,
-                          char *short_hlp,
-                          char *long_hlp,
-                          class cl_cmdset *acommands):
+                           int  can_rep,
+                           char *short_hlp,
+                           char *long_hlp,
+                           class cl_cmdset *acommands):
   cl_cmd(operate_on_none, aname, can_rep, short_hlp, long_hlp)
 {
   commands= acommands;
@@ -772,7 +785,7 @@ cl_super_cmd::~cl_super_cmd(void)
 
 int
 cl_super_cmd::work(class cl_app *app,
-                  class cl_cmdline *cmdline, class cl_console *con)
+                   class cl_cmdline *cmdline, class cl_console_base *con)
 {
   class cl_cmd *cmd= 0;
 
@@ -782,21 +795,21 @@ cl_super_cmd::work(class cl_app *app,
   if (!cmdline->shift())
     {
       if ((cmd= commands->get_cmd("_no_parameters_")) != 0)
-       return(cmd->work(app, cmdline, con));
+        return(cmd->work(app, cmdline, con));
       int i;
       con->dd_printf("\"%s\" must be followed by the name of a subcommand\n"
-                    "List of subcommands:\n", (char*)(names->at(0)));
+                     "List of subcommands:\n", (char*)(names->at(0)));
       for (i= 0; i < commands->count; i++)
-       {
-         cmd= (class cl_cmd *)(commands->at(i));
-         con->dd_printf("%s\n", cmd->short_help);
-       }
+        {
+          cmd= (class cl_cmd *)(commands->at(i));
+          con->dd_printf("%s\n", cmd->short_help);
+        }
       return(0);
     }
-  if ((cmd= commands->get_cmd(cmdline)) == NULL)
+  if ((cmd= commands->get_cmd(cmdline, con->accept_last())) == NULL)
     {
       con->dd_printf("Undefined subcommand: \"%s\". Try \"help %s\".\n",
-                    cmdline->get_name(), (char*)(names->at(0)));
+                     cmdline->get_name(), (char*)(names->at(0)));
       return(0);
     }
   return(cmd->work(app, cmdline, con));