* sim/ucsim/cmd.src/newcmd.cc, sim/ucsim/cmd.src/newcmdcl.h,
[fw/sdcc] / sim / ucsim / cmd.src / newcmdcl.h
index c0693331efadca2117add80e658a2943188eeb31..6655260af40a8ca5998345ae1cf3efd6ba75c52b 100644 (file)
@@ -32,181 +32,68 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "ddconfig.h"
 
 #include <stdio.h>
+#include <stdarg.h>
+#include <sys/types.h>
 #if FD_HEADER_OK
 # include HEADER_FD
 #endif
 
+// prj
 #include "pobjcl.h"
 
-
-#define SY_ADDR                'a'
-#define ADDRESS                "a"
-#define SY_NUMBER      'n'
-#define NUMBER         "n"
-#define SY_DATA                'd'
-#define DATA           "d"
-#define SY_STRING      's'
-#define STRING         "s"
-#define SY_MEMORY      'm'
-#define MEMORY         "m"
-#define SY_HW          'h'
-#define HW             "h"
-#define SY_DATALIST    'D'
-#define DATALIST       "D"
-#define SY_BIT         'b'
-#define BIT            "b"
-
-/*
- * Command line with parameters
- */
-
-class cl_cmdline: cl_base
+// sim.src
+#include "appcl.h"
+
+// local, cmd
+#include "commandcl.h"
+
+
+// Flags of consoles
+#define CONS_NONE        0
+#define CONS_DEBUG       0x01   // Print debug messages on this console
+#define CONS_FROZEN      0x02   // Console is frozen (g command issued)
+#define CONS_PROMPT      0x04   // Prompt is out, waiting for input
+#define CONS_INTERACTIVE 0x08   // Interactive console
+#define CONS_NOWELCOME   0x10   // Do not print welcome message
+#define CONS_INACTIVE    0x20   // Do not do any action
+#define CONS_ECHO        0x40   // Echo commands
+
+#define SY_ADDR         'a'
+#define ADDRESS         "a"
+#define SY_NUMBER       'n'
+#define NUMBER          "n"
+#define SY_DATA         'd'
+#define DATA            "d"
+#define SY_STRING       's'
+#define STRING          "s"
+#define SY_MEMORY       'm'
+#define MEMORY          "m"
+#define SY_HW           'h'
+#define HW              "h"
+#define SY_DATALIST     'D'
+#define DATALIST        "D"
+#define SY_BIT          'b'
+#define BIT             "b"
+
+
+class cl_prompt_option: public cl_optref
 {
-public:
-  char *cmd;
-  char *name;
-  class cl_list *params;
-  class cl_ustrings *tokens;
-  char *matched_syntax;
+protected:
   class cl_console *con;
-
 public:
-  cl_cmdline(char *acmd, class cl_console *acon);
-  virtual ~cl_cmdline(void);
+  cl_prompt_option(class cl_console *console);
   virtual int init(void);
-
-  virtual int split(void);
-  virtual int shift(void);
-  virtual int repeat(void);
-  virtual class cl_cmd_arg *param(int num);
-  virtual void insert_param(int pos, class cl_cmd_arg *param);
-  virtual bool syntax_match(class cl_sim *sim, char *syntax);
-  virtual bool set_data_list(class cl_cmd_arg *parm, int *iparm);
-private:
-  char *skip_delims(char *start);
-};
-
-
-/*
- * Command and container
- */
-
-// simple command
-class cl_cmd: public cl_base
-{
-public:
-  //class cl_sim *sim;
-  class cl_strings *names;
-  int  can_repeat;
-  char *short_help;
-  char *long_help;
-
-public:
-  cl_cmd(//class cl_sim *asim,
-        char *aname,
-        int  can_rep,
-        char *short_hlp,
-        char *long_hlp);
-  ~cl_cmd(void);
-
-  virtual void add_name(char *name);
-  virtual int name_match(char *aname, int strict);
-  virtual int name_match(class cl_cmdline *cmdline, int strict);
-  virtual int syntax_ok(class cl_cmdline *cmdline);
-  virtual int work(class cl_sim *sim,
-                  class cl_cmdline *cmdline, class cl_console *con);
-  virtual int do_work(class cl_sim *sim,
-                     class cl_cmdline *cmdline, class cl_console *con);
-};
-
-#define COMMAND_HEAD(CLASS_NAME) \
-class CLASS_NAME : public cl_cmd\
-{
-#define COMMAND_HEAD_ANCESTOR(CLASS_NAME,ANCESTOR) \
-class CLASS_NAME : public ANCESTOR \
-{
-
-#define COMMAND_METHODS(CLASS_NAME) \
-public:\
-  CLASS_NAME (char *aname,\
-              int  can_rep,\
-              char *chort_help,\
-              char *long_help):\
-    cl_cmd(aname, can_rep, short_help, long_help) {}\
-  virtual int do_work(class cl_sim *sim,\
-                     class cl_cmdline *cmdline, class cl_console *con);
-#define COMMAND_METHODS_ANCESTOR(CLASS_NAME,ANCESTOR) \
-public:\
-  CLASS_NAME (char *aname,\
-              int  can_rep,\
-              char *chort_help,\
-              char *long_help):\
-    ANCESTOR (aname, can_rep, short_help, long_help) {}\
-  virtual int do_work(class cl_sim *sim,\
-                     class cl_cmdline *cmdline, class cl_console *con);
-
-#define COMMAND_TAIL \
-}
-
-#define COMMAND(CLASS_NAME) \
-COMMAND_HEAD(CLASS_NAME) \
-COMMAND_METHODS(CLASS_NAME) \
-COMMAND_TAIL
-
-#define COMMAND_DATA(CLASS_NAME,DATA) \
-COMMAND_HEAD(CLASS_NAME) \
-public: DATA ; \
-COMMAND_METHODS(CLASS_NAME)\
-COMMAND_TAIL
-
-#define COMMAND_ANCESTOR(CLASS_NAME,ANCESTOR) \
-COMMAND_HEAD_ANCESTOR(CLASS_NAME,ANCESTOR) \
-COMMAND_METHODS_ANCESTOR(CLASS_NAME,ANCESTOR) \
-COMMAND_TAIL
-
-#define COMMAND_DATA_ANCESTOR(CLASS_NAME,ANCESTOR,DATA) \
-COMMAND_HEAD_ANCESTOR(CLASS_NAME,ANCESTOR) \
-public: DATA ; \
-COMMAND_METHODS_ANCESTOR(CLASS_NAME,ANCESTOR)\
-COMMAND_TAIL
-
-
-// Command set is list of cl_cmd objects
-class cl_cmdset: public cl_list
-{
-public:
-  class cl_sim *sim;
-  class cl_cmd *last_command;
-
-public:
-  cl_cmdset(class cl_sim *asim);
-
-  virtual class cl_cmd *get_cmd(class cl_cmdline *cmdline);
-  virtual class cl_cmd *get_cmd(char *cmd_name);
-  virtual void del(char *name);
-  virtual void replace(char *name, class cl_cmd *cmd);
+  virtual void option_changed(void);
 };
 
-// subset of commands
-class cl_super_cmd: public cl_cmd
+class cl_debug_option: public cl_prompt_option
 {
 public:
-  class cl_cmdset *commands;
-
-public:
-  cl_super_cmd(//class cl_sim *asim,
-              char *aname,
-              int  can_rep,
-              char *short_hlp,
-              char *long_hlp,
-              class cl_cmdset *acommands);
-  ~cl_super_cmd(void);
-
-  virtual int work(class cl_sim *sim,
-                  class cl_cmdline *cmdline, class cl_console *con);
+  cl_debug_option(class cl_console *console);
+  virtual int init(void);
+  virtual void option_changed(void);
 };
 
-
 /*
  * Command console
  */
@@ -215,33 +102,53 @@ class cl_console: public cl_base
 {
   friend class cl_commander;
 protected:
-  FILE *in, *out;
+  FILE *in, *out, *rout/*redirected output*/;
+  int id;
+  class cl_prompt_option *prompt_option;
+  class cl_optref *null_prompt_option;
+  class cl_debug_option *debug_option;
+  class cl_ustrings *lines_printed;
+  class cl_cmd *last_command;
+  class cl_cmdline *last_cmdline;
 public:
-  class cl_sim *sim;
-  char *last_command;
+  class cl_app *app;
   int flags; // See CONS_XXXX
   char *prompt;
-
+  
 public:
-  cl_console(): cl_base() {}
-  cl_console(char *fin, char *fout, class cl_sim *asim);
-  cl_console(FILE *fin, FILE *fout, class cl_sim *asim);
+  cl_console(void): cl_base() { app= 0; in= out= 0; flags= 0; }
+  cl_console(char *fin, char *fout, class cl_app *the_app);
+  cl_console(FILE *fin, FILE *fout, class cl_app *the_app);
+  cl_console(char *fin, FILE *fout);
 #ifdef SOCKET_AVAIL
-  cl_console(int portnumber, class cl_sim *asim);
+  cl_console(int portnumber, class cl_app *the_app);
 #endif
-  ~cl_console(void);
+  virtual ~cl_console(void);
+  virtual class cl_console *clone_for_exec(char *fin);
   virtual int init(void);
 
+  virtual bool accept_last(void);
+
   virtual void welcome(void);
+  virtual void redirect(char *fname, char *mode);
+  virtual void un_redirect(void);
+  int cmd_do_print(char *format, va_list ap);
   virtual void print_prompt(void);
-  virtual int  printf(char *format, ...);
+  virtual int  dd_printf(char *format, ...);
+  virtual int  debug(char *format, ...);
   virtual void print_bin(long data, int bits);
+  virtual void print_char_octal(char c);
   virtual int  match(int fdnum);
   virtual int  get_in_fd(void);
   virtual int  input_avail(void);
   virtual char *read_line(void);
-  virtual int  proc_input(class cl_app *app, class cl_cmdset *cmdset);
+  virtual int  proc_input(class cl_cmdset *cmdset);
   virtual bool interpret(char *cmd);
+  virtual void set_id(int new_id);
+  virtual int get_id(void) { return(id); }
+  virtual void set_prompt(char *p);
+private:
+  FILE *get_out(void) { return(rout?rout:out); }
 };
 
 #ifdef SOCKET_AVAIL
@@ -250,10 +157,9 @@ class cl_listen_console: public cl_console
 public:
   int sock;
 public:
-  cl_listen_console(int serverport, class cl_sim *asim);
+  cl_listen_console(int serverport, class cl_app *the_app);
 
   virtual void welcome(void) {}
-  virtual void prompt(void) {}
 
   virtual int match(int fdnum);
   virtual int get_in_fd(void);
@@ -262,6 +168,17 @@ public:
 #endif
 
 
+class cl_sub_console: public cl_console
+{
+  class cl_console *parent;
+public:
+  cl_sub_console(class cl_console *the_parent,
+                 FILE *fin, FILE *fout, class cl_app *the_app);
+  virtual ~cl_sub_console(void);
+  virtual int init(void);
+};
+
+
 /*
  * Command interpreter
  */
@@ -272,37 +189,38 @@ public:
   class cl_app *app;
   class cl_list *cons;
   fd_set read_set, active_set;
-  int fd_num;
-  class cl_sim *sim;
+  UCSOCKET_T fd_num;
   class cl_console *actual_console, *frozen_console;
   class cl_cmdset *cmdset;
 
 public:
   cl_commander(class cl_app *the_app,
-              class cl_cmdset *acmdset, class cl_sim *asim);
-  ~cl_commander(void);
+               class cl_cmdset *acmdset/*, class cl_sim *asim*/);
+  virtual ~cl_commander(void);
   virtual int init(void);
 
-  virtual class cl_console *mk_console(char *fin, char *fout,
-                                      class cl_sim *asim);
-  virtual class cl_console *mk_console(FILE *fin, FILE *fout,
-                                      class cl_sim *asim);
+  virtual class cl_console *mk_console(char *fin, char *fout);
+  virtual class cl_console *mk_console(FILE *fin, FILE *fout);
 #ifdef SOCKET_AVAIL
-  virtual class cl_console *mk_console(int portnumber, class cl_sim *asim);
+  virtual class cl_console *mk_console(int portnumber);
 #endif
   void add_console(class cl_console *console);
   void del_console(class cl_console *console);
+  void activate_console(class cl_console *console);
+  void deactivate_console(class cl_console *console);
   void set_fd_set(void);
 
-  int all_printf(char *format, ...);   // print to all consoles
-  int all_print(char *string, int length);
-  int printf(char *format, ...);       // print to actual_console
-  int debug(char *format, ...);                // print consoles with debug flag set
+  void prompt(void);
+  int all_printf(char *format, ...);    // print to all consoles
+  int dd_printf(char *format, ...);     // print to actual_console
+  int debug(char *format, ...);         // print consoles with debug flag set
+  int debug(char *format, va_list ap);  // print consoles with debug flag set
   int flag_printf(int iflags, char *format, ...);
   int input_avail(void);
   int input_avail_on_frozen(void);
   int wait_input(void);
   int proc_input(void);
+  void exec_on(class cl_console *cons, char *file_name);
 };