Fix compile error of CMDB which occurred by mbed-src modification.

Dependents:   mbed_controller_demo

Fork of CMDB by Wim van der Vegt

Committer:
wvd_vegt
Date:
Fri Feb 11 00:51:37 2011 +0000
Revision:
6:76b033971c3c
Parent:
3:abbf43fab7d5
Child:
7:269c2445b8f5
0.5

Who changed what in which revision?

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