A Command Interpreter with support for used defined commands, subsystems, macros, help and parameter parsing.

Committer:
wvd_vegt
Date:
Thu Feb 10 18:30:04 2011 +0000
Revision:
0:4d95ee0b4c37
Child:
3:abbf43fab7d5
Alpha

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wvd_vegt 0:4d95ee0b4c37 1 #include <vector>
wvd_vegt 0:4d95ee0b4c37 2 #include <stdlib.h>
wvd_vegt 0:4d95ee0b4c37 3 #include <stdio.h>
wvd_vegt 0:4d95ee0b4c37 4 #include <stdarg.h>
wvd_vegt 0:4d95ee0b4c37 5 #include <ctype.h>
wvd_vegt 0:4d95ee0b4c37 6 #include <string.h>
wvd_vegt 0:4d95ee0b4c37 7
wvd_vegt 0:4d95ee0b4c37 8 #include "cmdb.h"
wvd_vegt 0:4d95ee0b4c37 9 #include "mbed.h"
wvd_vegt 0:4d95ee0b4c37 10
wvd_vegt 0:4d95ee0b4c37 11 //DONE Pass Serial into constructor for printf, putc and getc.
wvd_vegt 0:4d95ee0b4c37 12 //DONE CID_<subsystem> must be handled internally.
wvd_vegt 0:4d95ee0b4c37 13 //
wvd_vegt 0:4d95ee0b4c37 14 //TODO ADD Documentation.
wvd_vegt 0:4d95ee0b4c37 15 //TODO CID_HELP must be handled internally (like all system commands (IDLE/MACRO etc).
wvd_vegt 0:4d95ee0b4c37 16 //TODO CID_HELP should be function (so we can call it easier in the switche's else branch).
wvd_vegt 0:4d95ee0b4c37 17 //TODO Link CID_LAST to Vector Size.
wvd_vegt 0:4d95ee0b4c37 18
wvd_vegt 0:4d95ee0b4c37 19 //Constructor (see http://www.daniweb.com/forums/thread293338.html)
wvd_vegt 0:4d95ee0b4c37 20 Cmdb::Cmdb(const Serial serial, const std::vector<cmdb_cmd>& cmds) : _serial(serial), _cmds(cmds) {
wvd_vegt 0:4d95ee0b4c37 21 echo = true;
wvd_vegt 0:4d95ee0b4c37 22 bold = true;
wvd_vegt 0:4d95ee0b4c37 23 subsystem = -1;
wvd_vegt 0:4d95ee0b4c37 24
wvd_vegt 0:4d95ee0b4c37 25 CID_LAST = _cmds.back().id;
wvd_vegt 0:4d95ee0b4c37 26 CMD_TBL_LEN = cmds.size();
wvd_vegt 0:4d95ee0b4c37 27
wvd_vegt 0:4d95ee0b4c37 28 cmdb_init(true);
wvd_vegt 0:4d95ee0b4c37 29 }
wvd_vegt 0:4d95ee0b4c37 30
wvd_vegt 0:4d95ee0b4c37 31 //Public
wvd_vegt 0:4d95ee0b4c37 32 bool Cmdb::cmdb_macro_hasnext() {
wvd_vegt 0:4d95ee0b4c37 33 return macro_ptr!=-1 && macro_ptr<MAX_CMD_LEN && macro_buf[macro_ptr];
wvd_vegt 0:4d95ee0b4c37 34 }
wvd_vegt 0:4d95ee0b4c37 35
wvd_vegt 0:4d95ee0b4c37 36 char Cmdb::cmdb_macro_next() {
wvd_vegt 0:4d95ee0b4c37 37 char ch = macro_buf[macro_ptr++];
wvd_vegt 0:4d95ee0b4c37 38 if (macro_ptr==MAX_CMD_LEN) {
wvd_vegt 0:4d95ee0b4c37 39 cmdb_macro_reset();
wvd_vegt 0:4d95ee0b4c37 40 }
wvd_vegt 0:4d95ee0b4c37 41 return ch;
wvd_vegt 0:4d95ee0b4c37 42 }
wvd_vegt 0:4d95ee0b4c37 43
wvd_vegt 0:4d95ee0b4c37 44 char Cmdb::cmdb_macro_peek() {
wvd_vegt 0:4d95ee0b4c37 45 return macro_buf[macro_ptr];
wvd_vegt 0:4d95ee0b4c37 46 }
wvd_vegt 0:4d95ee0b4c37 47
wvd_vegt 0:4d95ee0b4c37 48 void Cmdb::cmdb_macro_reset() {
wvd_vegt 0:4d95ee0b4c37 49 macro_ptr = -1;
wvd_vegt 0:4d95ee0b4c37 50 macro_buf[0] = '\0';
wvd_vegt 0:4d95ee0b4c37 51 }
wvd_vegt 0:4d95ee0b4c37 52
wvd_vegt 0:4d95ee0b4c37 53 bool Cmdb::cmdb_hasnext() {
wvd_vegt 0:4d95ee0b4c37 54 return _serial.readable()==1;
wvd_vegt 0:4d95ee0b4c37 55 }
wvd_vegt 0:4d95ee0b4c37 56
wvd_vegt 0:4d95ee0b4c37 57 char Cmdb::cmdb_next() {
wvd_vegt 0:4d95ee0b4c37 58 return _serial.getc();
wvd_vegt 0:4d95ee0b4c37 59 }
wvd_vegt 0:4d95ee0b4c37 60
wvd_vegt 0:4d95ee0b4c37 61 //Private Utilities #1
wvd_vegt 0:4d95ee0b4c37 62
wvd_vegt 0:4d95ee0b4c37 63 int Cmdb::cmdb_escid_search(char *escstr) {
wvd_vegt 0:4d95ee0b4c37 64 for (int i=0; i<ESC_TBL_LEN; i++) {
wvd_vegt 0:4d95ee0b4c37 65 if (strcmp (esc_tbl[i].escstr, escstr) == 0)
wvd_vegt 0:4d95ee0b4c37 66 return (esc_tbl[i].id);
wvd_vegt 0:4d95ee0b4c37 67 }
wvd_vegt 0:4d95ee0b4c37 68
wvd_vegt 0:4d95ee0b4c37 69 return (EID_LAST);
wvd_vegt 0:4d95ee0b4c37 70 }
wvd_vegt 0:4d95ee0b4c37 71
wvd_vegt 0:4d95ee0b4c37 72 int Cmdb::cmdb_cmdid_search(char *cmdstr) {
wvd_vegt 0:4d95ee0b4c37 73 //Warning, we return the ID but somewhere assume it's equal to the array index!
wvd_vegt 0:4d95ee0b4c37 74 for (int i=0; i<CMD_TBL_LEN; i++) {
wvd_vegt 0:4d95ee0b4c37 75 if ((stricmp (_cmds[i].cmdstr, cmdstr) == 0) && ((_cmds[i].subs == subsystem) || (_cmds[i].subs<0)))
wvd_vegt 0:4d95ee0b4c37 76 return (_cmds[i].id);
wvd_vegt 0:4d95ee0b4c37 77 }
wvd_vegt 0:4d95ee0b4c37 78
wvd_vegt 0:4d95ee0b4c37 79 return (CID_LAST);
wvd_vegt 0:4d95ee0b4c37 80 }
wvd_vegt 0:4d95ee0b4c37 81
wvd_vegt 0:4d95ee0b4c37 82 int Cmdb::cmdb_cmdid_index(int cmdid) {
wvd_vegt 0:4d95ee0b4c37 83 for (int i=0; i<CMD_TBL_LEN; i++) {
wvd_vegt 0:4d95ee0b4c37 84 if (_cmds[i].id==cmdid)
wvd_vegt 0:4d95ee0b4c37 85 return i;
wvd_vegt 0:4d95ee0b4c37 86 }
wvd_vegt 0:4d95ee0b4c37 87
wvd_vegt 0:4d95ee0b4c37 88 return -1;
wvd_vegt 0:4d95ee0b4c37 89 }
wvd_vegt 0:4d95ee0b4c37 90
wvd_vegt 0:4d95ee0b4c37 91 int Cmdb::cmdb_parse(char *cmd) {
wvd_vegt 0:4d95ee0b4c37 92 //Command
wvd_vegt 0:4d95ee0b4c37 93 char cmdstr_buf [1 + MAX_CMD_LEN];
wvd_vegt 0:4d95ee0b4c37 94
wvd_vegt 0:4d95ee0b4c37 95 //Parameters
wvd_vegt 0:4d95ee0b4c37 96 char argstr_buf [1 + MAX_CMD_LEN];
wvd_vegt 0:4d95ee0b4c37 97 char *argsep;
wvd_vegt 0:4d95ee0b4c37 98
wvd_vegt 0:4d95ee0b4c37 99 char prmstr_buf [1 + MAX_CMD_LEN]; //copy of sscanf pattern
wvd_vegt 0:4d95ee0b4c37 100 char *tok; //current token
wvd_vegt 0:4d95ee0b4c37 101 void *toks[MAX_ARGS]; //pointers to string tokens IN commandline (argstr_buf)
wvd_vegt 0:4d95ee0b4c37 102 char *prms[MAX_ARGS]; //patterns IN copy of sscanf string (*parms)
wvd_vegt 0:4d95ee0b4c37 103
wvd_vegt 0:4d95ee0b4c37 104 char typ = '\0'; //Var type
wvd_vegt 0:4d95ee0b4c37 105 char mod = '\0'; //Var modifier (for cardinal types)
wvd_vegt 0:4d95ee0b4c37 106 unsigned int base; //Var number base (8,10,16)
wvd_vegt 0:4d95ee0b4c37 107 //unsigned int bytes; //Var size in bytes (used for malloc)
wvd_vegt 0:4d95ee0b4c37 108
wvd_vegt 0:4d95ee0b4c37 109 float f; //Temp var for conversion, 4 bytes
wvd_vegt 0:4d95ee0b4c37 110 //unsigned char b; //Temp var for conversion, 1 byte
wvd_vegt 0:4d95ee0b4c37 111 //char c; //Temp var for conversion, 1 byte
wvd_vegt 0:4d95ee0b4c37 112 //short h; //Temp var for conversion, 2 bytes
wvd_vegt 0:4d95ee0b4c37 113 //int k; //Temp var for conversion, 2 bytes
wvd_vegt 0:4d95ee0b4c37 114 long l; //Temp var for conversion, 4 bytes
wvd_vegt 0:4d95ee0b4c37 115
wvd_vegt 0:4d95ee0b4c37 116 char* endptr; //strtoXX() Error detection
wvd_vegt 0:4d95ee0b4c37 117
wvd_vegt 0:4d95ee0b4c37 118 signed char id;
wvd_vegt 0:4d95ee0b4c37 119 unsigned int i;
wvd_vegt 0:4d95ee0b4c37 120
wvd_vegt 0:4d95ee0b4c37 121 //Init (global) variables.
wvd_vegt 0:4d95ee0b4c37 122 argfnd=0;
wvd_vegt 0:4d95ee0b4c37 123 argcnt=0;
wvd_vegt 0:4d95ee0b4c37 124 error =0;
wvd_vegt 0:4d95ee0b4c37 125
wvd_vegt 0:4d95ee0b4c37 126 //Signals empty string...
wvd_vegt 0:4d95ee0b4c37 127 id=-1;
wvd_vegt 0:4d95ee0b4c37 128
wvd_vegt 0:4d95ee0b4c37 129 //Zero the two string buffers for splitting cmd string into.
wvd_vegt 0:4d95ee0b4c37 130 zeromemory((char*)cmdstr_buf,sizeof(cmdstr_buf));
wvd_vegt 0:4d95ee0b4c37 131 zeromemory(argstr_buf,sizeof(argstr_buf));
wvd_vegt 0:4d95ee0b4c37 132
wvd_vegt 0:4d95ee0b4c37 133 //Make it worse in Lint
wvd_vegt 0:4d95ee0b4c37 134 for (i=0;i<MAX_ARGS;i++) {
wvd_vegt 0:4d95ee0b4c37 135 parms[i].type=PARM_UNUSED;
wvd_vegt 0:4d95ee0b4c37 136 zeromemory((char*)&(parms[i].val),sizeof(parms[i].val));
wvd_vegt 0:4d95ee0b4c37 137 }
wvd_vegt 0:4d95ee0b4c37 138
wvd_vegt 0:4d95ee0b4c37 139 /*------------------------------------------------
wvd_vegt 0:4d95ee0b4c37 140 First, copy the command and convert it to all
wvd_vegt 0:4d95ee0b4c37 141 uppercase.
wvd_vegt 0:4d95ee0b4c37 142 ------------------------------------------------*/
wvd_vegt 0:4d95ee0b4c37 143
wvd_vegt 0:4d95ee0b4c37 144 strncpy(cmdstr_buf, cmd, sizeof (cmdstr_buf) - 1);
wvd_vegt 0:4d95ee0b4c37 145 cmdstr_buf [sizeof (cmdstr_buf) - 1] = '\0';
wvd_vegt 0:4d95ee0b4c37 146
wvd_vegt 0:4d95ee0b4c37 147 /*------------------------------------------------
wvd_vegt 0:4d95ee0b4c37 148 Next, find the end of the first thing in the
wvd_vegt 0:4d95ee0b4c37 149 buffer. Since the command ends with a space,
wvd_vegt 0:4d95ee0b4c37 150 we'll look for that. NULL-Terminate the command
wvd_vegt 0:4d95ee0b4c37 151 and keep a pointer to the arguments.
wvd_vegt 0:4d95ee0b4c37 152 ------------------------------------------------*/
wvd_vegt 0:4d95ee0b4c37 153
wvd_vegt 0:4d95ee0b4c37 154 argsep = strchr(cmdstr_buf, ' ');
wvd_vegt 0:4d95ee0b4c37 155
wvd_vegt 0:4d95ee0b4c37 156 if (argsep == NULL) {
wvd_vegt 0:4d95ee0b4c37 157 argstr_buf [0] = '\0';
wvd_vegt 0:4d95ee0b4c37 158 } else {
wvd_vegt 0:4d95ee0b4c37 159 strcpy (argstr_buf, argsep + 1);
wvd_vegt 0:4d95ee0b4c37 160 *argsep = '\0';
wvd_vegt 0:4d95ee0b4c37 161 }
wvd_vegt 0:4d95ee0b4c37 162
wvd_vegt 0:4d95ee0b4c37 163 /*------------------------------------------------
wvd_vegt 0:4d95ee0b4c37 164 Search for a command ID, then switch on it. Note
wvd_vegt 0:4d95ee0b4c37 165 that I removed my action items for each command,
wvd_vegt 0:4d95ee0b4c37 166 but you would invoke each function here.
wvd_vegt 0:4d95ee0b4c37 167 VEG:Watch out ID not neccesarily equal to Array Index!
wvd_vegt 0:4d95ee0b4c37 168 ------------------------------------------------*/
wvd_vegt 0:4d95ee0b4c37 169
wvd_vegt 0:4d95ee0b4c37 170 //1) Find the Command Id
wvd_vegt 0:4d95ee0b4c37 171 id = cmdb_cmdid_search(cmdstr_buf);
wvd_vegt 0:4d95ee0b4c37 172
wvd_vegt 0:4d95ee0b4c37 173 if (id!=CID_LAST) {
wvd_vegt 0:4d95ee0b4c37 174 //2) Tokenize a copy of the parms from the cmd_tbl.
wvd_vegt 0:4d95ee0b4c37 175
wvd_vegt 0:4d95ee0b4c37 176 //Get Format patterns from cmd_tbl[id].parms.
wvd_vegt 0:4d95ee0b4c37 177 //Note: strtok inserts \0 into the original string. Hence the copy.
wvd_vegt 0:4d95ee0b4c37 178 zeromemory((char *)(&prmstr_buf),sizeof(prmstr_buf));
wvd_vegt 0:4d95ee0b4c37 179
wvd_vegt 0:4d95ee0b4c37 180 strncpy (prmstr_buf, _cmds[id].parms, sizeof (prmstr_buf) - 1);
wvd_vegt 0:4d95ee0b4c37 181
wvd_vegt 0:4d95ee0b4c37 182 argcnt=0;
wvd_vegt 0:4d95ee0b4c37 183 tok = strtok(prmstr_buf, " ");
wvd_vegt 0:4d95ee0b4c37 184 while (tok != NULL) {
wvd_vegt 0:4d95ee0b4c37 185 //Store Pointers
wvd_vegt 0:4d95ee0b4c37 186 prms[argcnt++] = tok;
wvd_vegt 0:4d95ee0b4c37 187
wvd_vegt 0:4d95ee0b4c37 188 //cmdb_printf("prm_%2.2d='%s'\r\n",argcnt, tok);
wvd_vegt 0:4d95ee0b4c37 189
wvd_vegt 0:4d95ee0b4c37 190 tok = strtok(NULL, " ");
wvd_vegt 0:4d95ee0b4c37 191 }
wvd_vegt 0:4d95ee0b4c37 192
wvd_vegt 0:4d95ee0b4c37 193 //3) Tokenize the commandline.
wvd_vegt 0:4d95ee0b4c37 194
wvd_vegt 0:4d95ee0b4c37 195 //Get Tokens from arguments.
wvd_vegt 0:4d95ee0b4c37 196 //Note: strtok inserts \0 into the original string. Won't harm here as we do not re-use it.
wvd_vegt 0:4d95ee0b4c37 197
wvd_vegt 0:4d95ee0b4c37 198 argfnd=0;
wvd_vegt 0:4d95ee0b4c37 199
wvd_vegt 0:4d95ee0b4c37 200 if (strlen(argstr_buf)!=0) {
wvd_vegt 0:4d95ee0b4c37 201 tok = strtok(argstr_buf, " ");
wvd_vegt 0:4d95ee0b4c37 202 } else {
wvd_vegt 0:4d95ee0b4c37 203 tok=NULL;
wvd_vegt 0:4d95ee0b4c37 204 }
wvd_vegt 0:4d95ee0b4c37 205
wvd_vegt 0:4d95ee0b4c37 206 while (tok != NULL) {
wvd_vegt 0:4d95ee0b4c37 207 //Store Pointers
wvd_vegt 0:4d95ee0b4c37 208 toks[argfnd++]=tok;
wvd_vegt 0:4d95ee0b4c37 209
wvd_vegt 0:4d95ee0b4c37 210 //cmdb_printf("tok_%2.2d='%s'\r\n",argfnd, tok);
wvd_vegt 0:4d95ee0b4c37 211
wvd_vegt 0:4d95ee0b4c37 212 tok = strtok(NULL, " ");
wvd_vegt 0:4d95ee0b4c37 213 }
wvd_vegt 0:4d95ee0b4c37 214
wvd_vegt 0:4d95ee0b4c37 215 if (argfnd==argcnt || (id==CID_HELP && argfnd==0)) {
wvd_vegt 0:4d95ee0b4c37 216
wvd_vegt 0:4d95ee0b4c37 217 error = 0;
wvd_vegt 0:4d95ee0b4c37 218
wvd_vegt 0:4d95ee0b4c37 219 for (i=0;i<argcnt;i++) {
wvd_vegt 0:4d95ee0b4c37 220 //cmdb_printf("prm_%2.2d=%s\r\n",i, prms[i]);
wvd_vegt 0:4d95ee0b4c37 221
wvd_vegt 0:4d95ee0b4c37 222 switch (strlen(prms[i])) {
wvd_vegt 0:4d95ee0b4c37 223 case 0:
wvd_vegt 0:4d95ee0b4c37 224 break;
wvd_vegt 0:4d95ee0b4c37 225 case 1:
wvd_vegt 0:4d95ee0b4c37 226 break;
wvd_vegt 0:4d95ee0b4c37 227 case 2: //Simple pattern, no modifier
wvd_vegt 0:4d95ee0b4c37 228 mod='\0';
wvd_vegt 0:4d95ee0b4c37 229 typ=prms[i][1];
wvd_vegt 0:4d95ee0b4c37 230
wvd_vegt 0:4d95ee0b4c37 231 break;
wvd_vegt 0:4d95ee0b4c37 232 case 3: //pattern with Modifier.
wvd_vegt 0:4d95ee0b4c37 233 mod=prms[i][1];
wvd_vegt 0:4d95ee0b4c37 234 typ=prms[i][2];
wvd_vegt 0:4d95ee0b4c37 235
wvd_vegt 0:4d95ee0b4c37 236 break;
wvd_vegt 0:4d95ee0b4c37 237 default:
wvd_vegt 0:4d95ee0b4c37 238 break;
wvd_vegt 0:4d95ee0b4c37 239 }
wvd_vegt 0:4d95ee0b4c37 240
wvd_vegt 0:4d95ee0b4c37 241 switch (typ) {
wvd_vegt 0:4d95ee0b4c37 242 case 'o' :
wvd_vegt 0:4d95ee0b4c37 243 base=8;
wvd_vegt 0:4d95ee0b4c37 244 break;
wvd_vegt 0:4d95ee0b4c37 245 case 'x' :
wvd_vegt 0:4d95ee0b4c37 246 base=16;
wvd_vegt 0:4d95ee0b4c37 247 break;
wvd_vegt 0:4d95ee0b4c37 248 default:
wvd_vegt 0:4d95ee0b4c37 249 base=10;
wvd_vegt 0:4d95ee0b4c37 250 break;
wvd_vegt 0:4d95ee0b4c37 251 }
wvd_vegt 0:4d95ee0b4c37 252
wvd_vegt 0:4d95ee0b4c37 253 endptr = (char*)toks[i];
wvd_vegt 0:4d95ee0b4c37 254
wvd_vegt 0:4d95ee0b4c37 255 //Cardinal Types
wvd_vegt 0:4d95ee0b4c37 256 switch (typ) {
wvd_vegt 0:4d95ee0b4c37 257 case 'd' : //Check mod
wvd_vegt 0:4d95ee0b4c37 258 case 'i' : //Check mod
wvd_vegt 0:4d95ee0b4c37 259 case 'u' : //Check mod
wvd_vegt 0:4d95ee0b4c37 260 case 'o' : //Check mod
wvd_vegt 0:4d95ee0b4c37 261 case 'x' : //Check mod
wvd_vegt 0:4d95ee0b4c37 262 switch (mod) {
wvd_vegt 0:4d95ee0b4c37 263 case 'b' : //char
wvd_vegt 0:4d95ee0b4c37 264 //test range
wvd_vegt 0:4d95ee0b4c37 265 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 0:4d95ee0b4c37 266 if (l>=MIN_BYTE && l<=MAX_BYTE) {
wvd_vegt 0:4d95ee0b4c37 267 parms[i].type=PARM_CHAR;
wvd_vegt 0:4d95ee0b4c37 268 parms[i].val.uc =(unsigned char)l;
wvd_vegt 0:4d95ee0b4c37 269 } else {
wvd_vegt 0:4d95ee0b4c37 270 error = i+1;
wvd_vegt 0:4d95ee0b4c37 271 }
wvd_vegt 0:4d95ee0b4c37 272
wvd_vegt 0:4d95ee0b4c37 273 break;
wvd_vegt 0:4d95ee0b4c37 274 case 'h' : //short
wvd_vegt 0:4d95ee0b4c37 275 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 0:4d95ee0b4c37 276 if (l>=MIN_SHORT && l<=MAX_SHORT) {
wvd_vegt 0:4d95ee0b4c37 277 parms[i].type=PARM_SHORT;
wvd_vegt 0:4d95ee0b4c37 278 parms[i].val.w=(short)l;
wvd_vegt 0:4d95ee0b4c37 279 } else {
wvd_vegt 0:4d95ee0b4c37 280 error = i+1;
wvd_vegt 0:4d95ee0b4c37 281 }
wvd_vegt 0:4d95ee0b4c37 282
wvd_vegt 0:4d95ee0b4c37 283 break;
wvd_vegt 0:4d95ee0b4c37 284 case 'l' : //long
wvd_vegt 0:4d95ee0b4c37 285 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 0:4d95ee0b4c37 286 parms[i].type=PARM_LONG;
wvd_vegt 0:4d95ee0b4c37 287 parms[i].val.l=l;
wvd_vegt 0:4d95ee0b4c37 288
wvd_vegt 0:4d95ee0b4c37 289 break;
wvd_vegt 0:4d95ee0b4c37 290 default:
wvd_vegt 0:4d95ee0b4c37 291 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 0:4d95ee0b4c37 292 if (l>=MIN_INT && l<=MAX_INT) {
wvd_vegt 0:4d95ee0b4c37 293 parms[i].type=PARM_INT;
wvd_vegt 0:4d95ee0b4c37 294 parms[i].val.l=(int)l;
wvd_vegt 0:4d95ee0b4c37 295 } else {
wvd_vegt 0:4d95ee0b4c37 296 error = i+1;
wvd_vegt 0:4d95ee0b4c37 297 }
wvd_vegt 0:4d95ee0b4c37 298 break;
wvd_vegt 0:4d95ee0b4c37 299 }
wvd_vegt 0:4d95ee0b4c37 300
wvd_vegt 0:4d95ee0b4c37 301 if (error==0 &&
wvd_vegt 0:4d95ee0b4c37 302 (endptr==toks[i] //No Conversion at all.
wvd_vegt 0:4d95ee0b4c37 303 || *endptr)) { //Incomplete conversion.
wvd_vegt 0:4d95ee0b4c37 304 error = i+1;
wvd_vegt 0:4d95ee0b4c37 305 }
wvd_vegt 0:4d95ee0b4c37 306
wvd_vegt 0:4d95ee0b4c37 307 break;
wvd_vegt 0:4d95ee0b4c37 308 }
wvd_vegt 0:4d95ee0b4c37 309
wvd_vegt 0:4d95ee0b4c37 310 //Floating Point Types
wvd_vegt 0:4d95ee0b4c37 311 switch (typ) {
wvd_vegt 0:4d95ee0b4c37 312 case 'e' :
wvd_vegt 0:4d95ee0b4c37 313 case 'f' :
wvd_vegt 0:4d95ee0b4c37 314 case 'g' :
wvd_vegt 0:4d95ee0b4c37 315 f = strtod((char*)toks[i], &endptr);
wvd_vegt 0:4d95ee0b4c37 316
wvd_vegt 0:4d95ee0b4c37 317 parms[i].type=PARM_FLOAT;
wvd_vegt 0:4d95ee0b4c37 318 parms[i].val.f=f;
wvd_vegt 0:4d95ee0b4c37 319
wvd_vegt 0:4d95ee0b4c37 320 if (error==0 &&
wvd_vegt 0:4d95ee0b4c37 321 (endptr==toks[i] //No Conversion at all.
wvd_vegt 0:4d95ee0b4c37 322 || *endptr)) { //Incomplete conversion.
wvd_vegt 0:4d95ee0b4c37 323 error = i;
wvd_vegt 0:4d95ee0b4c37 324 }
wvd_vegt 0:4d95ee0b4c37 325
wvd_vegt 0:4d95ee0b4c37 326 break;
wvd_vegt 0:4d95ee0b4c37 327 }
wvd_vegt 0:4d95ee0b4c37 328
wvd_vegt 0:4d95ee0b4c37 329 //String types
wvd_vegt 0:4d95ee0b4c37 330 switch (typ) {
wvd_vegt 0:4d95ee0b4c37 331 case 'c' :
wvd_vegt 0:4d95ee0b4c37 332 parms[i].type=PARM_CHAR;
wvd_vegt 0:4d95ee0b4c37 333 parms[i].val.c=((char*)toks[i])[0];
wvd_vegt 0:4d95ee0b4c37 334
wvd_vegt 0:4d95ee0b4c37 335 if (error==0 && strlen((char*)toks[i])!=1) { //Incomplete conversion.
wvd_vegt 0:4d95ee0b4c37 336 error = i;
wvd_vegt 0:4d95ee0b4c37 337 }
wvd_vegt 0:4d95ee0b4c37 338
wvd_vegt 0:4d95ee0b4c37 339 break;
wvd_vegt 0:4d95ee0b4c37 340
wvd_vegt 0:4d95ee0b4c37 341 case 's' :
wvd_vegt 0:4d95ee0b4c37 342 parms[i].type=PARM_STRING;
wvd_vegt 0:4d95ee0b4c37 343 strncpy(parms[i].val.s,(char*)toks[i], strlen((char*)toks[i]));
wvd_vegt 0:4d95ee0b4c37 344
wvd_vegt 0:4d95ee0b4c37 345 break;
wvd_vegt 0:4d95ee0b4c37 346 }
wvd_vegt 0:4d95ee0b4c37 347 }
wvd_vegt 0:4d95ee0b4c37 348 } else {
wvd_vegt 0:4d95ee0b4c37 349 //id=CID_LAST;
wvd_vegt 0:4d95ee0b4c37 350 }
wvd_vegt 0:4d95ee0b4c37 351 }
wvd_vegt 0:4d95ee0b4c37 352
wvd_vegt 0:4d95ee0b4c37 353 return id;
wvd_vegt 0:4d95ee0b4c37 354 }
wvd_vegt 0:4d95ee0b4c37 355
wvd_vegt 0:4d95ee0b4c37 356 void Cmdb::cmdb_cmd_proc(char *cmd) {
wvd_vegt 0:4d95ee0b4c37 357 int cid;
wvd_vegt 0:4d95ee0b4c37 358 int ndx;
wvd_vegt 0:4d95ee0b4c37 359
wvd_vegt 0:4d95ee0b4c37 360 cid = cmdb_parse(cmd);
wvd_vegt 0:4d95ee0b4c37 361 ndx = cmdb_cmdid_index(cid);
wvd_vegt 0:4d95ee0b4c37 362
wvd_vegt 0:4d95ee0b4c37 363 if (cid!=-1) {
wvd_vegt 0:4d95ee0b4c37 364
wvd_vegt 0:4d95ee0b4c37 365 /*------------------------------------------------
wvd_vegt 0:4d95ee0b4c37 366 Process the command and it's arguments that are
wvd_vegt 0:4d95ee0b4c37 367 found. id contains the command id and argcnt &
wvd_vegt 0:4d95ee0b4c37 368 argfnd the number of found and expected paramaters
wvd_vegt 0:4d95ee0b4c37 369 parms contains the parsed argument values and their
wvd_vegt 0:4d95ee0b4c37 370 types.
wvd_vegt 0:4d95ee0b4c37 371 ------------------------------------------------*/
wvd_vegt 0:4d95ee0b4c37 372
wvd_vegt 0:4d95ee0b4c37 373 if (cid==CID_LAST) {
wvd_vegt 0:4d95ee0b4c37 374 cmdb_print("Unknown command, type 'Help' for a list of available commands.\r\n");
wvd_vegt 0:4d95ee0b4c37 375 } else {
wvd_vegt 0:4d95ee0b4c37 376
wvd_vegt 0:4d95ee0b4c37 377 //Test for more commandline than allowed too.
wvd_vegt 0:4d95ee0b4c37 378 //i.e. run 1 is wrong.
wvd_vegt 0:4d95ee0b4c37 379
wvd_vegt 0:4d95ee0b4c37 380 //TODO Fix Index/Id problem.
wvd_vegt 0:4d95ee0b4c37 381
wvd_vegt 0:4d95ee0b4c37 382 if (argcnt==0 && argfnd==0 && error==0 && ndx!=-1 && _cmds[ndx].subs==SUBSYSTEM) {
wvd_vegt 0:4d95ee0b4c37 383 subsystem=cid;
wvd_vegt 0:4d95ee0b4c37 384 } else if ( ((cid==CID_HELP) || (argcnt==argfnd)) && error==0 ) {
wvd_vegt 0:4d95ee0b4c37 385 switch (cid) {
wvd_vegt 0:4d95ee0b4c37 386
wvd_vegt 0:4d95ee0b4c37 387 /////// GLOBAL MACRO COMMANDS ///////
wvd_vegt 0:4d95ee0b4c37 388
wvd_vegt 0:4d95ee0b4c37 389 //Define Macro from commandline
wvd_vegt 0:4d95ee0b4c37 390 case CID_MACRO:
wvd_vegt 0:4d95ee0b4c37 391 macro_ptr=-1;
wvd_vegt 0:4d95ee0b4c37 392 strncpy(macro_buf, STRINGPARM(0), sizeof(macro_buf) - 1);
wvd_vegt 0:4d95ee0b4c37 393 break;
wvd_vegt 0:4d95ee0b4c37 394
wvd_vegt 0:4d95ee0b4c37 395 //Run Macro
wvd_vegt 0:4d95ee0b4c37 396 case CID_RUN:
wvd_vegt 0:4d95ee0b4c37 397 macro_ptr=0;
wvd_vegt 0:4d95ee0b4c37 398 break;
wvd_vegt 0:4d95ee0b4c37 399
wvd_vegt 0:4d95ee0b4c37 400 //List Macro's
wvd_vegt 0:4d95ee0b4c37 401 case CID_MACROS:
wvd_vegt 0:4d95ee0b4c37 402 cmdb_print("[Macro]\r\n");
wvd_vegt 0:4d95ee0b4c37 403 if (macro_buf[0]) {
wvd_vegt 0:4d95ee0b4c37 404 cmdb_printf("Value=%s\r\n",macro_buf);
wvd_vegt 0:4d95ee0b4c37 405 } else {
wvd_vegt 0:4d95ee0b4c37 406 cmdb_printf(";No Macro Defined\r\n");
wvd_vegt 0:4d95ee0b4c37 407 }
wvd_vegt 0:4d95ee0b4c37 408 break;
wvd_vegt 0:4d95ee0b4c37 409
wvd_vegt 0:4d95ee0b4c37 410 /////// GLOBAL STATEMACHINE COMMANDS ///////
wvd_vegt 0:4d95ee0b4c37 411
wvd_vegt 0:4d95ee0b4c37 412 #ifdef STATEMACHINE
wvd_vegt 0:4d95ee0b4c37 413
wvd_vegt 0:4d95ee0b4c37 414 //Start State Machine
wvd_vegt 0:4d95ee0b4c37 415 case CID_STATE:
wvd_vegt 0:4d95ee0b4c37 416 statemachine(BYTEPARM(0));
wvd_vegt 0:4d95ee0b4c37 417
wvd_vegt 0:4d95ee0b4c37 418 break;
wvd_vegt 0:4d95ee0b4c37 419 #endif
wvd_vegt 0:4d95ee0b4c37 420
wvd_vegt 0:4d95ee0b4c37 421 /////// GLOBAL COMMANDS ///////
wvd_vegt 0:4d95ee0b4c37 422
wvd_vegt 0:4d95ee0b4c37 423 //Echo
wvd_vegt 0:4d95ee0b4c37 424 case CID_ECHO:
wvd_vegt 0:4d95ee0b4c37 425 echo = BOOLPARM(0);
wvd_vegt 0:4d95ee0b4c37 426 break;
wvd_vegt 0:4d95ee0b4c37 427
wvd_vegt 0:4d95ee0b4c37 428 //Bold
wvd_vegt 0:4d95ee0b4c37 429 case CID_BOLD:
wvd_vegt 0:4d95ee0b4c37 430 bold = BOOLPARM(0);
wvd_vegt 0:4d95ee0b4c37 431 break;
wvd_vegt 0:4d95ee0b4c37 432
wvd_vegt 0:4d95ee0b4c37 433 //Warm Boot
wvd_vegt 0:4d95ee0b4c37 434 case CID_BOOT:
wvd_vegt 0:4d95ee0b4c37 435 //reset();
wvd_vegt 0:4d95ee0b4c37 436 break;
wvd_vegt 0:4d95ee0b4c37 437
wvd_vegt 0:4d95ee0b4c37 438 //Sends an ANSI escape code to clear the screen.
wvd_vegt 0:4d95ee0b4c37 439 case CID_CLS:
wvd_vegt 0:4d95ee0b4c37 440 cmdb_print(cls);
wvd_vegt 0:4d95ee0b4c37 441 break;
wvd_vegt 0:4d95ee0b4c37 442
wvd_vegt 0:4d95ee0b4c37 443 //Returns to CMD> prompt where most commands are disabled.
wvd_vegt 0:4d95ee0b4c37 444 case CID_IDLE:
wvd_vegt 0:4d95ee0b4c37 445 subsystem=-1;
wvd_vegt 0:4d95ee0b4c37 446 break;
wvd_vegt 0:4d95ee0b4c37 447
wvd_vegt 0:4d95ee0b4c37 448 //Help
wvd_vegt 0:4d95ee0b4c37 449 case CID_HELP: {
wvd_vegt 0:4d95ee0b4c37 450
wvd_vegt 0:4d95ee0b4c37 451 //TODO Handle Subsystem
wvd_vegt 0:4d95ee0b4c37 452
wvd_vegt 0:4d95ee0b4c37 453 //TODO Call command processor callback and if it returns false we supply help.
wvd_vegt 0:4d95ee0b4c37 454
wvd_vegt 0:4d95ee0b4c37 455 cmdb_print("\r\n");
wvd_vegt 0:4d95ee0b4c37 456
wvd_vegt 0:4d95ee0b4c37 457 if (argfnd>0) {
wvd_vegt 0:4d95ee0b4c37 458 cid = cmdb_cmdid_search(STRINGPARM(0));
wvd_vegt 0:4d95ee0b4c37 459 } else {
wvd_vegt 0:4d95ee0b4c37 460 cid=CID_LAST;
wvd_vegt 0:4d95ee0b4c37 461 }
wvd_vegt 0:4d95ee0b4c37 462
wvd_vegt 0:4d95ee0b4c37 463 if (argfnd>0 && cid!=CID_LAST) {
wvd_vegt 0:4d95ee0b4c37 464
wvd_vegt 0:4d95ee0b4c37 465 //Help with a valid command as first parameter
wvd_vegt 0:4d95ee0b4c37 466 ndx = cmdb_cmdid_index(cid);
wvd_vegt 0:4d95ee0b4c37 467
wvd_vegt 0:4d95ee0b4c37 468 switch (_cmds[ndx].subs) {
wvd_vegt 0:4d95ee0b4c37 469 case SUBSYSTEM: //Dump whole subsystem
wvd_vegt 0:4d95ee0b4c37 470 cmdb_printf("%s subsystem commands:\r\n\r\n",_cmds[ndx].cmdstr);
wvd_vegt 0:4d95ee0b4c37 471
wvd_vegt 0:4d95ee0b4c37 472 for (int i=0;i<CMD_TBL_LEN-1;i++) {
wvd_vegt 0:4d95ee0b4c37 473 if (_cmds[i].subs==ndx) {
wvd_vegt 0:4d95ee0b4c37 474 cmdb_cmdhelp("",i,",\r\n");
wvd_vegt 0:4d95ee0b4c37 475 }
wvd_vegt 0:4d95ee0b4c37 476 }
wvd_vegt 0:4d95ee0b4c37 477
wvd_vegt 0:4d95ee0b4c37 478 break;
wvd_vegt 0:4d95ee0b4c37 479
wvd_vegt 0:4d95ee0b4c37 480 case GLOBALCMD: //Dump command only
wvd_vegt 0:4d95ee0b4c37 481 //cmdb_print("Global command:\r\n\r\n",cmd_tbl[cmd_tbl[ndx].subs].cmdstr);
wvd_vegt 0:4d95ee0b4c37 482 cmdb_cmdhelp("Syntax: ",ndx,".\r\n");
wvd_vegt 0:4d95ee0b4c37 483 break;
wvd_vegt 0:4d95ee0b4c37 484
wvd_vegt 0:4d95ee0b4c37 485 default: //Dump one subsystem command
wvd_vegt 0:4d95ee0b4c37 486 cmdb_printf("%s subsystem command:\r\n\r\n",_cmds[_cmds[ndx].subs].cmdstr);
wvd_vegt 0:4d95ee0b4c37 487 cmdb_cmdhelp("Syntax: ",ndx,".\r\n");
wvd_vegt 0:4d95ee0b4c37 488 break;
wvd_vegt 0:4d95ee0b4c37 489 }
wvd_vegt 0:4d95ee0b4c37 490 } else {
wvd_vegt 0:4d95ee0b4c37 491 if (argfnd>0) {
wvd_vegt 0:4d95ee0b4c37 492 //Help with invalid command as first parameter
wvd_vegt 0:4d95ee0b4c37 493 cmdb_print("Unknown command, type 'Help' for a list of available commands.\r\n");
wvd_vegt 0:4d95ee0b4c37 494 } else {
wvd_vegt 0:4d95ee0b4c37 495 //Help
wvd_vegt 0:4d95ee0b4c37 496
wvd_vegt 0:4d95ee0b4c37 497 //Dump Active Subsystem, Global & Other (dormant) Subsystems
wvd_vegt 0:4d95ee0b4c37 498 for (int i=0;i<CMD_TBL_LEN-1;i++) {
wvd_vegt 0:4d95ee0b4c37 499 if ((_cmds[i].subs<0) || (_cmds[i].subs==subsystem)) {
wvd_vegt 0:4d95ee0b4c37 500 cmdb_cmdhelp("",i,",\r\n");
wvd_vegt 0:4d95ee0b4c37 501 }
wvd_vegt 0:4d95ee0b4c37 502 }
wvd_vegt 0:4d95ee0b4c37 503 cmdb_cmdhelp("",CMD_TBL_LEN-1,".\r\n");
wvd_vegt 0:4d95ee0b4c37 504 }
wvd_vegt 0:4d95ee0b4c37 505 }
wvd_vegt 0:4d95ee0b4c37 506 cmdb_print("\r\n");
wvd_vegt 0:4d95ee0b4c37 507 break;
wvd_vegt 0:4d95ee0b4c37 508 } //CID_HELP
wvd_vegt 0:4d95ee0b4c37 509 }
wvd_vegt 0:4d95ee0b4c37 510 } else {
wvd_vegt 0:4d95ee0b4c37 511 cmdb_cmdhelp("Syntax: ",ndx,".\r\n");
wvd_vegt 0:4d95ee0b4c37 512 }
wvd_vegt 0:4d95ee0b4c37 513 }
wvd_vegt 0:4d95ee0b4c37 514 }
wvd_vegt 0:4d95ee0b4c37 515 }
wvd_vegt 0:4d95ee0b4c37 516
wvd_vegt 0:4d95ee0b4c37 517 //Private Utilities #2
wvd_vegt 0:4d95ee0b4c37 518
wvd_vegt 0:4d95ee0b4c37 519 void Cmdb::cmdb_init(const char full) {
wvd_vegt 0:4d95ee0b4c37 520 if (full) {
wvd_vegt 0:4d95ee0b4c37 521 echo = true;
wvd_vegt 0:4d95ee0b4c37 522 bold = true;
wvd_vegt 0:4d95ee0b4c37 523
wvd_vegt 0:4d95ee0b4c37 524 subsystem = -1;
wvd_vegt 0:4d95ee0b4c37 525
wvd_vegt 0:4d95ee0b4c37 526 lstbuf [cmdndx] = '\0';
wvd_vegt 0:4d95ee0b4c37 527
wvd_vegt 0:4d95ee0b4c37 528 cmdb_macro_reset();
wvd_vegt 0:4d95ee0b4c37 529
wvd_vegt 0:4d95ee0b4c37 530 cmdb_prompt();
wvd_vegt 0:4d95ee0b4c37 531 }
wvd_vegt 0:4d95ee0b4c37 532
wvd_vegt 0:4d95ee0b4c37 533 cmdndx = 0;
wvd_vegt 0:4d95ee0b4c37 534 cmdbuf [cmdndx] = '\0';
wvd_vegt 0:4d95ee0b4c37 535
wvd_vegt 0:4d95ee0b4c37 536 escndx = 0;
wvd_vegt 0:4d95ee0b4c37 537 escbuf [escndx] = '\0';
wvd_vegt 0:4d95ee0b4c37 538 }
wvd_vegt 0:4d95ee0b4c37 539
wvd_vegt 0:4d95ee0b4c37 540 void Cmdb::cmdb_prompt(void) {
wvd_vegt 0:4d95ee0b4c37 541 if (subsystem!=-1) {
wvd_vegt 0:4d95ee0b4c37 542 cmdb_printf("%s>",_cmds[subsystem].cmdstr);
wvd_vegt 0:4d95ee0b4c37 543 } else {
wvd_vegt 0:4d95ee0b4c37 544 cmdb_print(prompt);
wvd_vegt 0:4d95ee0b4c37 545 }
wvd_vegt 0:4d95ee0b4c37 546 }
wvd_vegt 0:4d95ee0b4c37 547
wvd_vegt 0:4d95ee0b4c37 548 bool Cmdb::cmdb_scan(const char c) {
wvd_vegt 0:4d95ee0b4c37 549 int i;
wvd_vegt 0:4d95ee0b4c37 550
wvd_vegt 0:4d95ee0b4c37 551 //See http://www.interfacebus.com/ASCII_Table.html
wvd_vegt 0:4d95ee0b4c37 552
wvd_vegt 0:4d95ee0b4c37 553 if (c == '\r') { // cr?
wvd_vegt 0:4d95ee0b4c37 554 cmdb_print(crlf); // Output it and ...
wvd_vegt 0:4d95ee0b4c37 555 if (cmdndx) {
wvd_vegt 0:4d95ee0b4c37 556 strncpy(lstbuf,cmdbuf,cmdndx);
wvd_vegt 0:4d95ee0b4c37 557 lstbuf[cmdndx]='\0';
wvd_vegt 0:4d95ee0b4c37 558 cmdb_cmd_proc(cmdbuf);
wvd_vegt 0:4d95ee0b4c37 559 }
wvd_vegt 0:4d95ee0b4c37 560 cmdb_init(false);
wvd_vegt 0:4d95ee0b4c37 561 cmdb_prompt();
wvd_vegt 0:4d95ee0b4c37 562
wvd_vegt 0:4d95ee0b4c37 563 return true;
wvd_vegt 0:4d95ee0b4c37 564 }
wvd_vegt 0:4d95ee0b4c37 565
wvd_vegt 0:4d95ee0b4c37 566 //TODO BACKSPACE NOT CORRECT FOR TELNET!
wvd_vegt 0:4d95ee0b4c37 567
wvd_vegt 0:4d95ee0b4c37 568 if (c == '\b') { // Backspace
wvd_vegt 0:4d95ee0b4c37 569 if (cmdndx != 0) {
wvd_vegt 0:4d95ee0b4c37 570 cmdb_print(bs);
wvd_vegt 0:4d95ee0b4c37 571 cmdbuf [--cmdndx] = '\0';
wvd_vegt 0:4d95ee0b4c37 572 } else {
wvd_vegt 0:4d95ee0b4c37 573 cmdb_printch(bell); // Output Error
wvd_vegt 0:4d95ee0b4c37 574 }
wvd_vegt 0:4d95ee0b4c37 575 return false;
wvd_vegt 0:4d95ee0b4c37 576 }
wvd_vegt 0:4d95ee0b4c37 577
wvd_vegt 0:4d95ee0b4c37 578 if (c == '\177') { // Delete
wvd_vegt 0:4d95ee0b4c37 579 while (cmdndx>0) {
wvd_vegt 0:4d95ee0b4c37 580 cmdb_print(bs);
wvd_vegt 0:4d95ee0b4c37 581 cmdbuf [--cmdndx] = '\0';
wvd_vegt 0:4d95ee0b4c37 582 }
wvd_vegt 0:4d95ee0b4c37 583 return false;
wvd_vegt 0:4d95ee0b4c37 584 }
wvd_vegt 0:4d95ee0b4c37 585
wvd_vegt 0:4d95ee0b4c37 586 //Reset Escape Buffer.
wvd_vegt 0:4d95ee0b4c37 587 if (c == '\033') {
wvd_vegt 0:4d95ee0b4c37 588 if (escndx!=0) {
wvd_vegt 0:4d95ee0b4c37 589 //_putchar(bell); // Output Error
wvd_vegt 0:4d95ee0b4c37 590 //printf("%s\r\n",escbuf);
wvd_vegt 0:4d95ee0b4c37 591 }
wvd_vegt 0:4d95ee0b4c37 592 escndx = 0;
wvd_vegt 0:4d95ee0b4c37 593 escbuf [escndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 0:4d95ee0b4c37 594 }
wvd_vegt 0:4d95ee0b4c37 595
wvd_vegt 0:4d95ee0b4c37 596 //Extract Escape Sequence.
wvd_vegt 0:4d95ee0b4c37 597 if (c == '\033' || escndx ) { // Wait for escape
wvd_vegt 0:4d95ee0b4c37 598 escbuf [escndx++] = (unsigned char) c; // Add to the buffer
wvd_vegt 0:4d95ee0b4c37 599 escbuf [escndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 0:4d95ee0b4c37 600 if (isalpha(c)) {
wvd_vegt 0:4d95ee0b4c37 601 switch (cmdb_escid_search(escbuf)) {
wvd_vegt 0:4d95ee0b4c37 602 case EID_CURSOR_LEFT : {
wvd_vegt 0:4d95ee0b4c37 603 if (cmdndx != 0) { // Backspace?
wvd_vegt 0:4d95ee0b4c37 604 cmdb_print(bs);
wvd_vegt 0:4d95ee0b4c37 605 cmdbuf [--cmdndx] = '\0';
wvd_vegt 0:4d95ee0b4c37 606 } else {
wvd_vegt 0:4d95ee0b4c37 607 cmdb_printch(bell); // Output char
wvd_vegt 0:4d95ee0b4c37 608 }
wvd_vegt 0:4d95ee0b4c37 609 break;
wvd_vegt 0:4d95ee0b4c37 610 }
wvd_vegt 0:4d95ee0b4c37 611 case EID_CURSOR_UP : {
wvd_vegt 0:4d95ee0b4c37 612 for (i=0;i<cmdndx;i++) {
wvd_vegt 0:4d95ee0b4c37 613 cmdb_print(bs);
wvd_vegt 0:4d95ee0b4c37 614 }
wvd_vegt 0:4d95ee0b4c37 615 cmdndx=strlen(lstbuf);
wvd_vegt 0:4d95ee0b4c37 616 strncpy(cmdbuf,lstbuf,cmdndx);
wvd_vegt 0:4d95ee0b4c37 617 cmdbuf[cmdndx]='\0';
wvd_vegt 0:4d95ee0b4c37 618 cmdb_printf("%s",cmdbuf);
wvd_vegt 0:4d95ee0b4c37 619 break;
wvd_vegt 0:4d95ee0b4c37 620 }
wvd_vegt 0:4d95ee0b4c37 621 case EID_CURSOR_RIGHT:
wvd_vegt 0:4d95ee0b4c37 622 break;
wvd_vegt 0:4d95ee0b4c37 623 case EID_CURSOR_DOWN :
wvd_vegt 0:4d95ee0b4c37 624 break;
wvd_vegt 0:4d95ee0b4c37 625 case EID_LAST :
wvd_vegt 0:4d95ee0b4c37 626 break;
wvd_vegt 0:4d95ee0b4c37 627 default :
wvd_vegt 0:4d95ee0b4c37 628 cmdb_printch(bell);
wvd_vegt 0:4d95ee0b4c37 629 break;
wvd_vegt 0:4d95ee0b4c37 630 }
wvd_vegt 0:4d95ee0b4c37 631 escndx=0;
wvd_vegt 0:4d95ee0b4c37 632 escbuf [escndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 0:4d95ee0b4c37 633 }
wvd_vegt 0:4d95ee0b4c37 634 return false;
wvd_vegt 0:4d95ee0b4c37 635 }
wvd_vegt 0:4d95ee0b4c37 636
wvd_vegt 0:4d95ee0b4c37 637 if (c=='\n') { // LF
wvd_vegt 0:4d95ee0b4c37 638 return false; // Dump it
wvd_vegt 0:4d95ee0b4c37 639 }
wvd_vegt 0:4d95ee0b4c37 640
wvd_vegt 0:4d95ee0b4c37 641 if (!isprint (c)) { // Printable character?
wvd_vegt 0:4d95ee0b4c37 642 cmdb_printch(bell);
wvd_vegt 0:4d95ee0b4c37 643 return false;
wvd_vegt 0:4d95ee0b4c37 644 }
wvd_vegt 0:4d95ee0b4c37 645
wvd_vegt 0:4d95ee0b4c37 646 if (cmdndx >= MAX_CMD_LEN) { // Past buffer length?
wvd_vegt 0:4d95ee0b4c37 647 cmdb_printch(bell);
wvd_vegt 0:4d95ee0b4c37 648 return false;
wvd_vegt 0:4d95ee0b4c37 649 }
wvd_vegt 0:4d95ee0b4c37 650
wvd_vegt 0:4d95ee0b4c37 651 cmdbuf [cmdndx++] = (unsigned char) c; // Add to the buffer
wvd_vegt 0:4d95ee0b4c37 652 cmdbuf [cmdndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 0:4d95ee0b4c37 653
wvd_vegt 0:4d95ee0b4c37 654 if (echo) {
wvd_vegt 0:4d95ee0b4c37 655 cmdb_printch(c); // Output char
wvd_vegt 0:4d95ee0b4c37 656 }
wvd_vegt 0:4d95ee0b4c37 657
wvd_vegt 0:4d95ee0b4c37 658 return false;
wvd_vegt 0:4d95ee0b4c37 659 }
wvd_vegt 0:4d95ee0b4c37 660
wvd_vegt 0:4d95ee0b4c37 661 //Private Utilities #3
wvd_vegt 0:4d95ee0b4c37 662
wvd_vegt 0:4d95ee0b4c37 663 int Cmdb::cmdb_printf(const char *format, ...) {
wvd_vegt 0:4d95ee0b4c37 664 int cnt;
wvd_vegt 0:4d95ee0b4c37 665
wvd_vegt 0:4d95ee0b4c37 666 va_list args;
wvd_vegt 0:4d95ee0b4c37 667 char buf[1024];
wvd_vegt 0:4d95ee0b4c37 668
wvd_vegt 0:4d95ee0b4c37 669 memset(buf,'\0',sizeof(buf));
wvd_vegt 0:4d95ee0b4c37 670
wvd_vegt 0:4d95ee0b4c37 671 va_start(args, format);
wvd_vegt 0:4d95ee0b4c37 672 cnt = vsnprintf(buf, sizeof(buf), format, args);
wvd_vegt 0:4d95ee0b4c37 673 if (cnt==-1) {
wvd_vegt 0:4d95ee0b4c37 674 //Error
wvd_vegt 0:4d95ee0b4c37 675 }
wvd_vegt 0:4d95ee0b4c37 676 va_end(args);
wvd_vegt 0:4d95ee0b4c37 677
wvd_vegt 0:4d95ee0b4c37 678 return cmdb_print(buf);
wvd_vegt 0:4d95ee0b4c37 679 }
wvd_vegt 0:4d95ee0b4c37 680
wvd_vegt 0:4d95ee0b4c37 681 //Link to outside world.
wvd_vegt 0:4d95ee0b4c37 682 int Cmdb::cmdb_print(const char *msg) {
wvd_vegt 0:4d95ee0b4c37 683 return _serial.printf(msg);
wvd_vegt 0:4d95ee0b4c37 684 }
wvd_vegt 0:4d95ee0b4c37 685
wvd_vegt 0:4d95ee0b4c37 686 //Link to outside world.
wvd_vegt 0:4d95ee0b4c37 687 char Cmdb::cmdb_printch(const char ch) {
wvd_vegt 0:4d95ee0b4c37 688 return _serial.putc(ch);
wvd_vegt 0:4d95ee0b4c37 689 }
wvd_vegt 0:4d95ee0b4c37 690
wvd_vegt 0:4d95ee0b4c37 691 void Cmdb::cmdb_cmdhelp(char *pre, int ndx, char *post) {
wvd_vegt 0:4d95ee0b4c37 692 int j;
wvd_vegt 0:4d95ee0b4c37 693 int k;
wvd_vegt 0:4d95ee0b4c37 694 int lastmod;
wvd_vegt 0:4d95ee0b4c37 695
wvd_vegt 0:4d95ee0b4c37 696 k=0;
wvd_vegt 0:4d95ee0b4c37 697 lastmod=0;
wvd_vegt 0:4d95ee0b4c37 698
wvd_vegt 0:4d95ee0b4c37 699 switch (_cmds[ndx].subs) {
wvd_vegt 0:4d95ee0b4c37 700 case SUBSYSTEM :
wvd_vegt 0:4d95ee0b4c37 701 break;
wvd_vegt 0:4d95ee0b4c37 702 case GLOBALCMD :
wvd_vegt 0:4d95ee0b4c37 703 break;
wvd_vegt 0:4d95ee0b4c37 704 case HIDDENSUB :
wvd_vegt 0:4d95ee0b4c37 705 return;
wvd_vegt 0:4d95ee0b4c37 706 default :
wvd_vegt 0:4d95ee0b4c37 707 if (strlen(pre)==0 && bold) {
wvd_vegt 0:4d95ee0b4c37 708 cmdb_print(boldon);
wvd_vegt 0:4d95ee0b4c37 709 }
wvd_vegt 0:4d95ee0b4c37 710 break;
wvd_vegt 0:4d95ee0b4c37 711 }
wvd_vegt 0:4d95ee0b4c37 712
wvd_vegt 0:4d95ee0b4c37 713 cmdb_print(pre);
wvd_vegt 0:4d95ee0b4c37 714 k+=strlen(pre);
wvd_vegt 0:4d95ee0b4c37 715
wvd_vegt 0:4d95ee0b4c37 716 if (k==0) {
wvd_vegt 0:4d95ee0b4c37 717 cmdb_printf("%12s",_cmds[ndx].cmdstr);
wvd_vegt 0:4d95ee0b4c37 718 k+=12;
wvd_vegt 0:4d95ee0b4c37 719 } else {
wvd_vegt 0:4d95ee0b4c37 720 if (strlen(pre)>0 && bold) {
wvd_vegt 0:4d95ee0b4c37 721 cmdb_print(boldon);
wvd_vegt 0:4d95ee0b4c37 722 }
wvd_vegt 0:4d95ee0b4c37 723
wvd_vegt 0:4d95ee0b4c37 724 cmdb_printf("%s",_cmds[ndx].cmdstr);
wvd_vegt 0:4d95ee0b4c37 725 k+=strlen(_cmds[ndx].cmdstr);
wvd_vegt 0:4d95ee0b4c37 726
wvd_vegt 0:4d95ee0b4c37 727 if (strlen(pre)>0 && bold) {
wvd_vegt 0:4d95ee0b4c37 728 cmdb_print(boldoff);
wvd_vegt 0:4d95ee0b4c37 729 }
wvd_vegt 0:4d95ee0b4c37 730 }
wvd_vegt 0:4d95ee0b4c37 731
wvd_vegt 0:4d95ee0b4c37 732 if (strlen(_cmds[ndx].parms)) {
wvd_vegt 0:4d95ee0b4c37 733 cmdb_printch(sp);
wvd_vegt 0:4d95ee0b4c37 734 k++;
wvd_vegt 0:4d95ee0b4c37 735 }
wvd_vegt 0:4d95ee0b4c37 736
wvd_vegt 0:4d95ee0b4c37 737 for (j=0;j<strlen(_cmds[ndx].parms);j++) {
wvd_vegt 0:4d95ee0b4c37 738 switch (_cmds[ndx].parms[j]) {
wvd_vegt 0:4d95ee0b4c37 739 case '%' :
wvd_vegt 0:4d95ee0b4c37 740 lastmod=0;
wvd_vegt 0:4d95ee0b4c37 741 break;
wvd_vegt 0:4d95ee0b4c37 742
wvd_vegt 0:4d95ee0b4c37 743 case 'b' :
wvd_vegt 0:4d95ee0b4c37 744 lastmod=8;
wvd_vegt 0:4d95ee0b4c37 745 break;
wvd_vegt 0:4d95ee0b4c37 746 case 'h' :
wvd_vegt 0:4d95ee0b4c37 747 lastmod=16;
wvd_vegt 0:4d95ee0b4c37 748 break;
wvd_vegt 0:4d95ee0b4c37 749 case 'l' :
wvd_vegt 0:4d95ee0b4c37 750 lastmod=32;
wvd_vegt 0:4d95ee0b4c37 751 break;
wvd_vegt 0:4d95ee0b4c37 752
wvd_vegt 0:4d95ee0b4c37 753 case 'd' :
wvd_vegt 0:4d95ee0b4c37 754 case 'i' : {
wvd_vegt 0:4d95ee0b4c37 755 switch (lastmod) {
wvd_vegt 0:4d95ee0b4c37 756 case 0 :
wvd_vegt 0:4d95ee0b4c37 757 case 16 :
wvd_vegt 0:4d95ee0b4c37 758 cmdb_print("int");
wvd_vegt 0:4d95ee0b4c37 759 k+=3;
wvd_vegt 0:4d95ee0b4c37 760 break;
wvd_vegt 0:4d95ee0b4c37 761 case 8 :
wvd_vegt 0:4d95ee0b4c37 762 cmdb_print("shortint");
wvd_vegt 0:4d95ee0b4c37 763 k+=8;
wvd_vegt 0:4d95ee0b4c37 764 break;
wvd_vegt 0:4d95ee0b4c37 765 case 32:
wvd_vegt 0:4d95ee0b4c37 766 cmdb_print("longint");
wvd_vegt 0:4d95ee0b4c37 767 k+=7;
wvd_vegt 0:4d95ee0b4c37 768 break;
wvd_vegt 0:4d95ee0b4c37 769 }
wvd_vegt 0:4d95ee0b4c37 770 break;
wvd_vegt 0:4d95ee0b4c37 771 }
wvd_vegt 0:4d95ee0b4c37 772
wvd_vegt 0:4d95ee0b4c37 773 case 'u' :
wvd_vegt 0:4d95ee0b4c37 774 case 'o' :
wvd_vegt 0:4d95ee0b4c37 775 case 'x' : {
wvd_vegt 0:4d95ee0b4c37 776 switch (lastmod) {
wvd_vegt 0:4d95ee0b4c37 777 case 0 :
wvd_vegt 0:4d95ee0b4c37 778 case 16 :
wvd_vegt 0:4d95ee0b4c37 779 cmdb_print("word");
wvd_vegt 0:4d95ee0b4c37 780 k+=4;
wvd_vegt 0:4d95ee0b4c37 781 break;
wvd_vegt 0:4d95ee0b4c37 782 case 8 :
wvd_vegt 0:4d95ee0b4c37 783 cmdb_print("byte");
wvd_vegt 0:4d95ee0b4c37 784 k+=4;
wvd_vegt 0:4d95ee0b4c37 785 break;
wvd_vegt 0:4d95ee0b4c37 786 case 32 :
wvd_vegt 0:4d95ee0b4c37 787 cmdb_print("dword");
wvd_vegt 0:4d95ee0b4c37 788 k+=5;
wvd_vegt 0:4d95ee0b4c37 789 break;
wvd_vegt 0:4d95ee0b4c37 790 }
wvd_vegt 0:4d95ee0b4c37 791
wvd_vegt 0:4d95ee0b4c37 792 switch (_cmds[ndx].parms[j]) {
wvd_vegt 0:4d95ee0b4c37 793 case 'o' :
wvd_vegt 0:4d95ee0b4c37 794 cmdb_print("[o]");
wvd_vegt 0:4d95ee0b4c37 795 k+=3;
wvd_vegt 0:4d95ee0b4c37 796 break;
wvd_vegt 0:4d95ee0b4c37 797 case 'x' :
wvd_vegt 0:4d95ee0b4c37 798 cmdb_print("[h]");
wvd_vegt 0:4d95ee0b4c37 799 k+=3;
wvd_vegt 0:4d95ee0b4c37 800 break;
wvd_vegt 0:4d95ee0b4c37 801 }
wvd_vegt 0:4d95ee0b4c37 802
wvd_vegt 0:4d95ee0b4c37 803 break;
wvd_vegt 0:4d95ee0b4c37 804 }
wvd_vegt 0:4d95ee0b4c37 805
wvd_vegt 0:4d95ee0b4c37 806 case 'e' :
wvd_vegt 0:4d95ee0b4c37 807 case 'f' :
wvd_vegt 0:4d95ee0b4c37 808 case 'g' :
wvd_vegt 0:4d95ee0b4c37 809 cmdb_print("float");
wvd_vegt 0:4d95ee0b4c37 810 k+=5;
wvd_vegt 0:4d95ee0b4c37 811 break;
wvd_vegt 0:4d95ee0b4c37 812
wvd_vegt 0:4d95ee0b4c37 813 case 'c' :
wvd_vegt 0:4d95ee0b4c37 814 cmdb_print("char");
wvd_vegt 0:4d95ee0b4c37 815 k+=4;
wvd_vegt 0:4d95ee0b4c37 816 break;
wvd_vegt 0:4d95ee0b4c37 817
wvd_vegt 0:4d95ee0b4c37 818 case 's' :
wvd_vegt 0:4d95ee0b4c37 819 cmdb_print("string");
wvd_vegt 0:4d95ee0b4c37 820 k+=6;
wvd_vegt 0:4d95ee0b4c37 821 break;
wvd_vegt 0:4d95ee0b4c37 822
wvd_vegt 0:4d95ee0b4c37 823 case ' ' :
wvd_vegt 0:4d95ee0b4c37 824 cmdb_printch(sp);
wvd_vegt 0:4d95ee0b4c37 825 k++;
wvd_vegt 0:4d95ee0b4c37 826 break;
wvd_vegt 0:4d95ee0b4c37 827 }
wvd_vegt 0:4d95ee0b4c37 828 }
wvd_vegt 0:4d95ee0b4c37 829
wvd_vegt 0:4d95ee0b4c37 830 for (j=k;j<40;j++) cmdb_printch(sp);
wvd_vegt 0:4d95ee0b4c37 831
wvd_vegt 0:4d95ee0b4c37 832 switch (_cmds[ndx].subs) {
wvd_vegt 0:4d95ee0b4c37 833 case SUBSYSTEM :
wvd_vegt 0:4d95ee0b4c37 834 if (ndx==subsystem) {
wvd_vegt 0:4d95ee0b4c37 835 cmdb_printf("- %s (active subsystem)%s",_cmds[ndx].cmddescr,post);
wvd_vegt 0:4d95ee0b4c37 836 } else {
wvd_vegt 0:4d95ee0b4c37 837 cmdb_printf("- %s (dormant subsystem)%s",_cmds[ndx].cmddescr,post);
wvd_vegt 0:4d95ee0b4c37 838 }
wvd_vegt 0:4d95ee0b4c37 839 break;
wvd_vegt 0:4d95ee0b4c37 840 case HIDDENSUB :
wvd_vegt 0:4d95ee0b4c37 841 break;
wvd_vegt 0:4d95ee0b4c37 842 case GLOBALCMD :
wvd_vegt 0:4d95ee0b4c37 843 cmdb_printf("- %s (global command)%s",_cmds[ndx].cmddescr,post);
wvd_vegt 0:4d95ee0b4c37 844 break;
wvd_vegt 0:4d95ee0b4c37 845 default :
wvd_vegt 0:4d95ee0b4c37 846 cmdb_printf("- %s%s",_cmds[ndx].cmddescr,post);
wvd_vegt 0:4d95ee0b4c37 847 if (strlen(pre)==0 && bold) {
wvd_vegt 0:4d95ee0b4c37 848 cmdb_print(boldoff);
wvd_vegt 0:4d95ee0b4c37 849 }
wvd_vegt 0:4d95ee0b4c37 850 break;
wvd_vegt 0:4d95ee0b4c37 851 }
wvd_vegt 0:4d95ee0b4c37 852
wvd_vegt 0:4d95ee0b4c37 853 if (strlen(pre)>0 && strlen(_cmds[ndx].parmdescr)) {
wvd_vegt 0:4d95ee0b4c37 854 cmdb_printf("Params: %s",_cmds[ndx].parmdescr);
wvd_vegt 0:4d95ee0b4c37 855 cmdb_print("\r\n");
wvd_vegt 0:4d95ee0b4c37 856 }
wvd_vegt 0:4d95ee0b4c37 857 }
wvd_vegt 0:4d95ee0b4c37 858
wvd_vegt 0:4d95ee0b4c37 859 //------------------------------------------------------------------------------
wvd_vegt 0:4d95ee0b4c37 860 //----Wrappers
wvd_vegt 0:4d95ee0b4c37 861 //------------------------------------------------------------------------------
wvd_vegt 0:4d95ee0b4c37 862
wvd_vegt 0:4d95ee0b4c37 863 void Cmdb::zeromemory(char *p,unsigned int siz) {
wvd_vegt 0:4d95ee0b4c37 864 memset(p,'\0',siz);
wvd_vegt 0:4d95ee0b4c37 865 }
wvd_vegt 0:4d95ee0b4c37 866
wvd_vegt 0:4d95ee0b4c37 867 int Cmdb::stricmp (char *s1, char *s2) {
wvd_vegt 0:4d95ee0b4c37 868 int i;
wvd_vegt 0:4d95ee0b4c37 869 int len1,len2;
wvd_vegt 0:4d95ee0b4c37 870
wvd_vegt 0:4d95ee0b4c37 871 len1=strlen(s1);
wvd_vegt 0:4d95ee0b4c37 872 len2=strlen(s2);
wvd_vegt 0:4d95ee0b4c37 873
wvd_vegt 0:4d95ee0b4c37 874 for (i = 0; (i<len1) && (i<len2);i++) {
wvd_vegt 0:4d95ee0b4c37 875 if ( toupper (s1[i])<toupper(s2[i]) ) return (-1);
wvd_vegt 0:4d95ee0b4c37 876 if ( toupper (s1[i])>toupper(s2[i]) ) return (+1);
wvd_vegt 0:4d95ee0b4c37 877 }
wvd_vegt 0:4d95ee0b4c37 878
wvd_vegt 0:4d95ee0b4c37 879 if (len1<len2) return (-1);
wvd_vegt 0:4d95ee0b4c37 880 if (len1>len2) return (+1);
wvd_vegt 0:4d95ee0b4c37 881
wvd_vegt 0:4d95ee0b4c37 882 return (0);
wvd_vegt 0:4d95ee0b4c37 883 }