#include "ddconfig.h"
#include <stdio.h>
+#include <sys/types.h> // to define fd_set
#if FD_HEADER_OK
# include HEADER_FD
#endif
+// prj
#include "pobjcl.h"
+// sim.src
+#include "appcl.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"
+
+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
{
public:
+ class cl_app *app;
char *cmd;
char *name;
class cl_list *params;
class cl_ustrings *tokens;
+ char *matched_syntax;
+ class cl_console *con;
public:
- cl_cmdline(char *cmd);
+ cl_cmdline(class cl_app *the_app, char *acmd, class cl_console *acon);
virtual ~cl_cmdline(void);
virtual int init(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);
};
class cl_cmd: public cl_base
{
public:
- class cl_sim *sim;
+ enum cmd_operate_on operate_on;
class cl_strings *names;
int can_repeat;
char *short_help;
char *long_help;
public:
- cl_cmd(class cl_sim *asim,
+ cl_cmd(enum cmd_operate_on opon,
char *aname,
int can_rep,
char *short_hlp,
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_cmdline *cmdline, class cl_console *con);
+ 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_sim *sim;
class cl_cmd *last_command;
public:
- cl_cmdset(class cl_sim *asim);
+ 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);
};
class cl_cmdset *commands;
public:
- cl_super_cmd(class cl_sim *asim,
- char *aname,
+ 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_cmdline *cmdline, class cl_console *con);
+ virtual int work(class cl_app *app,
+ class cl_cmdline *cmdline, class cl_console *con);
};
protected:
FILE *in, *out;
public:
- class cl_sim *sim;
+ class cl_app *app;
char *last_command;
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);
#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 int init(void);
virtual int get_in_fd(void);
virtual int input_avail(void);
virtual char *read_line(void);
- virtual int proc_input(void);
+ virtual int proc_input(class cl_cmdset *cmdset);
virtual bool interpret(char *cmd);
- virtual bool old_command(class cl_cmdline *cmdline) { return(DD_FALSE); }
};
#ifdef SOCKET_AVAIL
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);
- virtual int proc_input(void);
+ virtual int proc_input(class cl_cmdset *cmdset);
};
#endif
class cl_commander: public cl_base
{
public:
+ class cl_app *app;
class cl_list *cons;
fd_set read_set, active_set;
int fd_num;
- class cl_sim *sim;
+ //class cl_sim *sim;
class cl_console *actual_console, *frozen_console;
+ class cl_cmdset *cmdset;
public:
- cl_commander(class cl_sim *asim);
+ cl_commander(class cl_app *the_app,
+ class cl_cmdset *acmdset/*, class cl_sim *asim*/);
~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);