#include "ddconfig.h"
#include <stdio.h>
+#include <stdarg.h>
+#include <sys/types.h>
#if FD_HEADER_OK
# include HEADER_FD
#endif
// 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_BIT 'b'
#define BIT "b"
-enum cmd_operate_on {
- operate_on_none,
- operate_on_app,
- operate_on_sim,
- operate_on_uc
-};
-
-
-/*
- * Command line with parameters
- */
-class cl_cmdline: cl_base
+class cl_prompt_option: public cl_optref
{
-public:
- class cl_app *app;
- char *cmd;
- char *name;
- class cl_list *params;
- class cl_ustrings *tokens;
- char *matched_syntax;
+protected:
class cl_console *con;
-
public:
- cl_cmdline(class cl_app *the_app, 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_uc *uc, char *syntax);
- virtual bool set_data_list(class cl_cmd_arg *parm, int *iparm);
-private:
- char *skip_delims(char *start);
+ virtual void option_changed(void);
};
-
-/*
- * Command and container
- */
-
-// simple command
-class cl_cmd: public cl_base
+class cl_debug_option: public cl_prompt_option
{
public:
- enum cmd_operate_on operate_on;
- class cl_strings *names;
- int can_repeat;
- char *short_help;
- char *long_help;
-
-public:
- cl_cmd(enum cmd_operate_on opon,
- 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_app *app,
- class cl_cmdline *cmdline, class cl_console *con);
- virtual int do_work(class cl_cmdline *cmdline, class cl_console *con);
- virtual int do_work(class cl_app *app,
- class cl_cmdline *cmdline, class cl_console *con);
- virtual int do_work(class cl_sim *sim,
- class cl_cmdline *cmdline, class cl_console *con);
- virtual int do_work(class cl_uc *uc,
- 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 *short_help,\
- char *long_help):\
- cl_cmd(operate_on_none, aname, can_rep, short_help, long_help) {}\
- virtual int do_work(class cl_cmdline *cmdline, class cl_console *con);
-
-#define COMMAND_METHODS_ON(ON,CLASS_NAME) \
-public:\
- CLASS_NAME (char *aname,\
- int can_rep,\
- char *short_help,\
- char *long_help):\
- cl_cmd(operate_on_ ## ON, aname, can_rep, short_help, long_help) {}\
- virtual int do_work(class cl_ ## ON * ON ,\
- class cl_cmdline *cmdline, class cl_console *con);
-
-#define COMMAND_METHODS_ANCESTOR(CLASS_NAME,ANCESTOR) \
-public:\
- CLASS_NAME (char *aname,\
- int can_rep,\
- char *short_help,\
- char *long_help):\
- ANCESTOR (aname, can_rep, short_help, long_help) {}\
- virtual int do_work(class cl_cmdline *cmdline, class cl_console *con);
-
-#define COMMAND_METHODS_ANCESTOR_ON(ON,CLASS_NAME,ANCESTOR) \
-public:\
- CLASS_NAME (char *aname,\
- int can_rep,\
- char *short_help,\
- char *long_help):\
- ANCESTOR (aname, can_rep, short_help, long_help) {}\
- virtual int do_work(class cl_ ## ON * ON ,\
- 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_ON(ON,CLASS_NAME) \
-COMMAND_HEAD(CLASS_NAME) \
-COMMAND_METHODS_ON(ON,CLASS_NAME) \
-COMMAND_TAIL
-
-#define COMMAND_DATA(CLASS_NAME,DATA) \
-COMMAND_HEAD(CLASS_NAME) \
-public: DATA ; \
-COMMAND_METHODS(CLASS_NAME)\
-COMMAND_TAIL
-
-#define COMMAND_DATA_ON(ON,CLASS_NAME,DATA) \
-COMMAND_HEAD(CLASS_NAME) \
-public: DATA ; \
-COMMAND_METHODS_ON(ON,CLASS_NAME)\
-COMMAND_TAIL
-
-#define COMMAND_ANCESTOR_ON(ON,CLASS_NAME,ANCESTOR) \
-COMMAND_HEAD_ANCESTOR(CLASS_NAME,ANCESTOR) \
-COMMAND_METHODS_ANCESTOR_ON(ON,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
-
-#define COMMAND_DATA_ANCESTOR_ON(ON,CLASS_NAME,ANCESTOR,DATA) \
-COMMAND_HEAD_ANCESTOR(CLASS_NAME,ANCESTOR) \
-public: DATA ; \
-COMMAND_METHODS_ANCESTOR_ON(ON,CLASS_NAME,ANCESTOR)\
-COMMAND_TAIL
-
-#define COMMAND_DO_WORK(CLASS_NAME) \
-int \
-CLASS_NAME::do_work(class cl_cmdline *cmdline, class cl_console *con)
-#define COMMAND_DO_WORK_APP(CLASS_NAME) \
-int \
-CLASS_NAME::do_work(class cl_app *app,\
- class cl_cmdline *cmdline, class cl_console *con)
-#define COMMAND_DO_WORK_SIM(CLASS_NAME) \
-int \
-CLASS_NAME::do_work(class cl_sim *sim,\
- class cl_cmdline *cmdline, class cl_console *con)
-#define COMMAND_DO_WORK_UC(CLASS_NAME) \
-int \
-CLASS_NAME::do_work(class cl_uc *uc,\
- class cl_cmdline *cmdline, class cl_console *con)
-
-// 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(void);
- //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);
-};
-
-// subset of commands
-class cl_super_cmd: public cl_cmd
-{
-public:
- class cl_cmdset *commands;
-
-public:
- cl_super_cmd(char *aname,
- int can_rep,
- char *short_hlp,
- char *long_hlp,
- class cl_cmdset *acommands);
- ~cl_super_cmd(void);
-
- virtual int work(class cl_app *app,
- 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
*/
{
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_app *app;
- char *last_command;
int flags; // See CONS_XXXX
char *prompt;
-
+
public:
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_app *the_app);
#endif
- ~cl_console(void);
+ virtual ~cl_console(void);
+ virtual class cl_console *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);
+ virtual FILE *get_out(void) { return(rout?rout:out); }
+ int cmd_do_print(FILE *f, 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_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);
};
#ifdef SOCKET_AVAIL
#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
*/
public:
cl_commander(class cl_app *the_app,
class cl_cmdset *acmdset/*, class cl_sim *asim*/);
- ~cl_commander(void);
+ virtual ~cl_commander(void);
virtual int init(void);
virtual class cl_console *mk_console(char *fin, char *fout);
#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);
+ void prompt(void);
+ FILE *get_out(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 dd_printf(char *format, ...); // print to actual_console
+ int dd_printf(char *format, va_list ap);// 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);
};