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

Committer:
wvd_vegt
Date:
Thu Feb 10 19:10:42 2011 +0000
Revision:
3:abbf43fab7d5
Parent:
0:4d95ee0b4c37
Child:
6:76b033971c3c
Alpha

Who changed what in which revision?

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