Fix of cl_cmdline::syntax_match
[fw/sdcc] / sim / ucsim / sim.src / arg.cc
index 4a79f7479ce4ceaf83669e5b125285b32478bf5a..8777353cc9c41308ad2dd7b4b081464ccc81cdcc 100644 (file)
@@ -128,9 +128,10 @@ cl_cmd_arg::~cl_cmd_arg(void)
 }
 
 bool
-cl_cmd_arg::as_address(void)
+cl_cmd_arg::as_address(class cl_uc *uc)
 {
-  return(get_address(&(value.address)));    
+  bool b= get_address(uc, &(value.address));
+  return(b);
 }
 
 bool
@@ -149,7 +150,7 @@ cl_cmd_arg::as_data(void)
 }
 
 bool
-cl_cmd_arg::as_memory(void)
+cl_cmd_arg::as_memory(class cl_uc *uc)
 {
   value.memory= uc->mem(s_value);
   return(value.memory != 0);
@@ -189,12 +190,12 @@ cl_cmd_arg::as_bit(class cl_uc *uc)
 
 /* Interger number */
 
-cl_cmd_int_arg::cl_cmd_int_arg(class cl_uc *iuc, long addr):
-  cl_cmd_arg(iuc, addr)
+cl_cmd_int_arg::cl_cmd_int_arg(/*class cl_uc *iuc,*/ long addr):
+  cl_cmd_arg(/*iuc,*/ addr)
 {}
 
 bool
-cl_cmd_int_arg::get_address(t_addr *addr)
+cl_cmd_int_arg::get_address(class cl_uc *uc, t_addr *addr)
 {
   long iv;
 
@@ -212,9 +213,12 @@ cl_cmd_int_arg::get_bit_address(class cl_uc *uc, // input
 {
   t_addr bit_addr;
 
-  if (!get_address(&bit_addr))
+  if (!get_address(uc, &bit_addr))
     return(DD_FALSE);
-  return(uc->extract_bit_address(bit_addr, mem, mem_addr, bit_mask));
+  
+  if (mem)
+    *mem= uc->bit2mem(bit_addr, mem_addr, bit_mask);
+  return(mem && *mem);
 }
 
 bool
@@ -229,8 +233,8 @@ cl_cmd_int_arg::as_string(void)
 
 /* Symbol */
 
-cl_cmd_sym_arg::cl_cmd_sym_arg(class cl_uc *iuc, char *sym):
-  cl_cmd_arg(iuc, sym)
+cl_cmd_sym_arg::cl_cmd_sym_arg(/*class cl_uc *iuc,*/ char *sym):
+  cl_cmd_arg(/*iuc,*/ sym)
 {}
 
 bool
@@ -245,7 +249,7 @@ cl_cmd_sym_arg::as_string(void)
 }
 
 bool
-cl_cmd_sym_arg::get_address(t_addr *addr)
+cl_cmd_sym_arg::get_address(class cl_uc *uc, t_addr *addr)
 {
   struct name_entry *ne;
 
@@ -272,11 +276,13 @@ cl_cmd_sym_arg::get_bit_address(class cl_uc *uc, // input
                          get_svalue(),
                          uc)) == NULL)
     return(DD_FALSE);
-  return(uc->extract_bit_address(ne->addr, mem, mem_addr, bit_mask));
+  if (mem)
+    *mem= uc->bit2mem(ne->addr, mem_addr, bit_mask);
+  return(mem && *mem);
 }
 
 bool
-cl_cmd_sym_arg::as_address(void)
+cl_cmd_sym_arg::as_address(class cl_uc *uc)
 {
   struct name_entry *ne;
   //printf("SYM %s as addr?\n",get_svalue());
@@ -308,16 +314,16 @@ cl_cmd_sym_arg::as_hw(class cl_uc *uc)
 
 /* String */
 
-cl_cmd_str_arg::cl_cmd_str_arg(class cl_uc *iuc, char *str):
-  cl_cmd_arg(iuc, str)
+cl_cmd_str_arg::cl_cmd_str_arg(/*class cl_uc *iuc,*/ char *str):
+  cl_cmd_arg(/*iuc,*/ str)
 {}
 
 
 /* Bit */
 
-cl_cmd_bit_arg::cl_cmd_bit_arg(class cl_uc *iuc,
+cl_cmd_bit_arg::cl_cmd_bit_arg(/*class cl_uc *iuc,*/
                               class cl_cmd_arg *asfr, class cl_cmd_arg *abit):
-  cl_cmd_arg(iuc, (long)0)
+  cl_cmd_arg(/*iuc,*/ (long)0)
 {
   sfr= asfr;
   bit= abit;
@@ -332,10 +338,10 @@ cl_cmd_bit_arg::~cl_cmd_bit_arg(void)
 }
 
 bool
-cl_cmd_bit_arg::get_address(t_addr *addr)
+cl_cmd_bit_arg::get_address(class cl_uc *uc, t_addr *addr)
 {
   if (sfr)
-    return(sfr->get_address(addr));
+    return(sfr->get_address(uc, addr));
   return(0);
 }
 
@@ -345,52 +351,43 @@ cl_cmd_bit_arg::get_bit_address(class cl_uc *uc, // input
                                t_addr *mem_addr,
                                t_mem *bit_mask)
 {
-printf("**1\n");
   if (mem)
     *mem= uc->mem(MEM_SFR);
-printf("**2\n");
   if (mem_addr)
     {
-printf("**3\n");
       if (!sfr ||
-         !sfr->get_address(mem_addr))
+         !sfr->get_address(uc, mem_addr))
        return(DD_FALSE);
-printf("**4\n");
     }
-printf("**5\n");
   if (bit_mask)
     {
-printf("**6\n");
       if (!bit)
        return(DD_FALSE);
-printf("**7\n");
       long l;
       if (!bit->get_ivalue(&l) ||
          l > 7)
        return(DD_FALSE);
-printf("**8\n");
       *bit_mask= 1 << l;
     }
-printf("**9\n");
   return(DD_TRUE);
 }
 
 
 /* Array */
 
-cl_cmd_array_arg::cl_cmd_array_arg(class cl_uc *iuc,
+cl_cmd_array_arg::cl_cmd_array_arg(/*class cl_uc *iuc,*/
                                   class cl_cmd_arg *aname,
                                   class cl_cmd_arg *aindex):
-  cl_cmd_arg(iuc, (long)0)
+  cl_cmd_arg(/*iuc,*/ (long)0)
 {
-  name = aname;
+  name_arg= aname;
   index= aindex;
 }
 
 cl_cmd_array_arg::~cl_cmd_array_arg(void)
 {
-  if (name)
-    delete name;
+  if (name_arg)
+    delete name_arg;
   if (index)
     delete index;
 }
@@ -401,10 +398,10 @@ cl_cmd_array_arg::as_hw(class cl_uc *uc)
   char *n;
   t_addr a;
 
-  if (name == 0 ||
+  if (name_arg == 0 ||
       index == 0 ||
-      (n= name->get_svalue()) == NULL ||
-      !index->get_address(&a))
+      (n= name_arg->get_svalue()) == NULL ||
+      !index->get_address(uc, &a))
     return(DD_FALSE);
   
   value.hw= uc->get_hw(n, a, NULL);
@@ -452,4 +449,113 @@ cl_prg_arg::~cl_prg_arg(void)
 }
 
 
+/*
+ * List of arguments
+ *----------------------------------------------------------------------------
+ */
+
+int
+cl_arguments::arg_avail(char nam)
+{
+  class cl_prg_arg *a;
+  int i;
+
+  for (i= 0; i < count; i++)
+    {
+      a= (class cl_prg_arg *)(at(i));
+      if (a->short_name == nam)
+       return(1);
+    }
+  return(0);
+}
+
+int
+cl_arguments::arg_avail(char *nam)
+{
+  class cl_prg_arg *a;
+  int i;
+
+  for (i= 0; i < count; i++)
+    {
+      a= (class cl_prg_arg *)(at(i));
+      if (a->long_name &&
+         strcmp(a->long_name, nam) == 0)
+       return(1);
+    }
+  return(0);
+}
+
+long
+cl_arguments::get_iarg(char sname, char *lname)
+{
+  class cl_prg_arg *a;
+  int i;
+
+  for (i= 0; i < count; i++)
+    {
+      a= (class cl_prg_arg *)(at(i));
+      if ((sname && a->short_name == sname) ||
+         (lname && a->long_name && strcmp(a->long_name, lname) == 0))
+       {
+         long iv;
+         if (a->get_ivalue(&iv))
+           return(iv);
+         else
+           //FIXME
+           return(0);
+       }
+    }
+  return(0);
+}
+
+char *
+cl_arguments::get_sarg(char sname, char *lname)
+{
+  class cl_prg_arg *a;
+  int i;
+
+  for (i= 0; i < count; i++)
+    {
+      a= (class cl_prg_arg *)(at(i));
+      if ((sname && a->short_name == sname) ||
+         (lname && a->long_name && strcmp(a->long_name, lname) == 0))
+       return(a->get_svalue());
+    }
+  return(0);
+}
+
+
+double
+cl_arguments::get_farg(char sname, char *lname)
+{
+  class cl_prg_arg *a;
+  int i;
+
+  for (i= 0; i < count; i++)
+    {
+      a= (class cl_prg_arg *)(at(i));
+      if ((sname && a->short_name == sname) ||
+         (lname && a->long_name && strcmp(a->long_name, lname) == 0))
+       return(a->get_fvalue());
+    }
+  return(0);
+}
+
+void *
+cl_arguments::get_parg(char sname, char *lname)
+{
+  class cl_prg_arg *a;
+  int i;
+
+  for (i= 0; i < count; i++)
+    {
+      a= (class cl_prg_arg *)(at(i));
+      if ((sname && a->short_name == sname) ||
+         (lname && a->long_name && strcmp(a->long_name, lname) == 0))
+       return(a->get_pvalue());
+    }
+  return(0);
+}
+
+
 /* End of arg.cc */