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

Committer:
wvd_vegt
Date:
Tue Sep 20 18:14:33 2011 +0000
Revision:
18:7a4dc478d022
Parent:
17:7e6a723d65de
1) Made lots of stuff static (including the cmd struct). This is a breaking change (easy to fix though).

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 18:7a4dc478d022 6 Version: 0.80
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 14:c652ce068f6c 16 -Handle subsystems internally.
wvd_vegt 7:269c2445b8f5 17 -Removed CMD_TBL_LEN.
wvd_vegt 7:269c2445b8f5 18 -CID_LAST is now defined as CID_HELP+1.
wvd_vegt 14:c652ce068f6c 19 11022011 -Added Documentation.
wvd_vegt 7:269c2445b8f5 20 -Added code to take number limits from the C++ Runtime instead of hard defined values.
wvd_vegt 8:83edd6addbd5 21 -Renamed id to cid in cmd.
wvd_vegt 7:269c2445b8f5 22 -Added MAX_LONG and MIN_LONG (long==int on mbed).
wvd_vegt 7:269c2445b8f5 23 -Removed cmdb_ prefix from members.
wvd_vegt 8:83edd6addbd5 24 -Tested Macro Support and added it to the Demo.
wvd_vegt 9:dc9faec79298 25 -Added CID_COMMANDS.
wvd_vegt 16:ec8147828286 26 -Fixed a small bug in parse.
wvd_vegt 16:ec8147828286 27 -v0.76
wvd_vegt 16:ec8147828286 28 24032011 -Fixed some left-over bugs caused by index/id mixup.
wvd_vegt 17:7e6a723d65de 29 09052011 -Added present(), replace() and indexof() methods.
wvd_vegt 17:7e6a723d65de 30 replace() can be used to replace the complete command vector
wvd_vegt 17:7e6a723d65de 31 by a changed done. Inserting directly into cmdb's copy fails
wvd_vegt 17:7e6a723d65de 32 somehow.
wvd_vegt 18:7a4dc478d022 33 19092011 -Added PrintSection(), PrintValue() and PrintValuef() for
wvd_vegt 18:7a4dc478d022 34 easier Windows Ini File style output. As I use it to transfer
wvd_vegt 18:7a4dc478d022 35 data back to the PC (Easy parsing AND you can add/remove
wvd_vegt 18:7a4dc478d022 36 debug information without breaking PC code).
wvd_vegt 18:7a4dc478d022 37 20092011 -Breaking change, Made all cmd object static const like:
wvd_vegt 18:7a4dc478d022 38
wvd_vegt 18:7a4dc478d022 39 static const cmd HELP = {"Help",GLOBALCMD,CID_HELP,"%s","Help"};
wvd_vegt 18:7a4dc478d022 40
wvd_vegt 18:7a4dc478d022 41 this saves just to much ram memory on the heap.
wvd_vegt 18:7a4dc478d022 42 Thanks to Igor Skochinsky.
wvd_vegt 18:7a4dc478d022 43
wvd_vegt 18:7a4dc478d022 44 -Made some more const string static.
wvd_vegt 18:7a4dc478d022 45 -v0.80
wvd_vegt 6:76b033971c3c 46 -------- --------------------------------------------------------------
wvd_vegt 6:76b033971c3c 47 TODO's
wvd_vegt 7:269c2445b8f5 48 10022011 -Tweak and Review Documentation.
wvd_vegt 7:269c2445b8f5 49 11022011 -Check & Test **PARM masks.
wvd_vegt 7:269c2445b8f5 50 -Remove prefix from class members?
wvd_vegt 6:76b033971c3c 51 -------- --------------------------------------------------------------
wvd_vegt 6:76b033971c3c 52 _____________________________________________________________________________
wvd_vegt 6:76b033971c3c 53 */
wvd_vegt 6:76b033971c3c 54
wvd_vegt 3:abbf43fab7d5 55 #include <vector>
wvd_vegt 3:abbf43fab7d5 56 #include <stdlib.h>
wvd_vegt 3:abbf43fab7d5 57 #include <stdio.h>
wvd_vegt 3:abbf43fab7d5 58 #include <stdarg.h>
wvd_vegt 3:abbf43fab7d5 59 #include <ctype.h>
wvd_vegt 3:abbf43fab7d5 60 #include <string.h>
wvd_vegt 3:abbf43fab7d5 61
wvd_vegt 3:abbf43fab7d5 62 #include "cmdb.h"
wvd_vegt 3:abbf43fab7d5 63 #include "mbed.h"
wvd_vegt 3:abbf43fab7d5 64
wvd_vegt 7:269c2445b8f5 65 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 66
wvd_vegt 17:7e6a723d65de 67 Cmdb::Cmdb(const Serial& _serial, std::vector<cmd>& _cmds, void (*_callback)(Cmdb&,int)) :
wvd_vegt 17:7e6a723d65de 68 serial(_serial), cmds(_cmds) {
wvd_vegt 3:abbf43fab7d5 69 echo = true;
wvd_vegt 3:abbf43fab7d5 70 bold = true;
wvd_vegt 8:83edd6addbd5 71
wvd_vegt 18:7a4dc478d022 72 NoComment = NULL;
wvd_vegt 18:7a4dc478d022 73 DefComPos = 72;
wvd_vegt 18:7a4dc478d022 74
wvd_vegt 3:abbf43fab7d5 75 subsystem = -1;
wvd_vegt 3:abbf43fab7d5 76
wvd_vegt 17:7e6a723d65de 77 user_callback = _callback;
wvd_vegt 6:76b033971c3c 78
wvd_vegt 7:269c2445b8f5 79 init(true);
wvd_vegt 3:abbf43fab7d5 80 }
wvd_vegt 3:abbf43fab7d5 81
wvd_vegt 18:7a4dc478d022 82 const char* Cmdb::NoComment;
wvd_vegt 18:7a4dc478d022 83
wvd_vegt 18:7a4dc478d022 84 int Cmdb::DefComPos;
wvd_vegt 18:7a4dc478d022 85
wvd_vegt 7:269c2445b8f5 86 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 87 // Public Stuff.
wvd_vegt 7:269c2445b8f5 88 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 89
wvd_vegt 7:269c2445b8f5 90 bool Cmdb::macro_hasnext() {
wvd_vegt 3:abbf43fab7d5 91 return macro_ptr!=-1 && macro_ptr<MAX_CMD_LEN && macro_buf[macro_ptr];
wvd_vegt 3:abbf43fab7d5 92 }
wvd_vegt 3:abbf43fab7d5 93
wvd_vegt 7:269c2445b8f5 94 char Cmdb::macro_next() {
wvd_vegt 3:abbf43fab7d5 95 char ch = macro_buf[macro_ptr++];
wvd_vegt 6:76b033971c3c 96
wvd_vegt 3:abbf43fab7d5 97 if (macro_ptr==MAX_CMD_LEN) {
wvd_vegt 7:269c2445b8f5 98 macro_reset();
wvd_vegt 3:abbf43fab7d5 99 }
wvd_vegt 6:76b033971c3c 100
wvd_vegt 8:83edd6addbd5 101 //Translate Special Characters Back
wvd_vegt 8:83edd6addbd5 102 switch (ch) {
wvd_vegt 8:83edd6addbd5 103 case '|':
wvd_vegt 8:83edd6addbd5 104 return cr;
wvd_vegt 8:83edd6addbd5 105 case '_':
wvd_vegt 8:83edd6addbd5 106 return sp;
wvd_vegt 8:83edd6addbd5 107 default:
wvd_vegt 8:83edd6addbd5 108 return ch;
wvd_vegt 8:83edd6addbd5 109 }
wvd_vegt 3:abbf43fab7d5 110 }
wvd_vegt 3:abbf43fab7d5 111
wvd_vegt 7:269c2445b8f5 112 char Cmdb::macro_peek() {
wvd_vegt 3:abbf43fab7d5 113 return macro_buf[macro_ptr];
wvd_vegt 3:abbf43fab7d5 114 }
wvd_vegt 3:abbf43fab7d5 115
wvd_vegt 7:269c2445b8f5 116 void Cmdb::macro_reset() {
wvd_vegt 3:abbf43fab7d5 117 macro_ptr = -1;
wvd_vegt 3:abbf43fab7d5 118 macro_buf[0] = '\0';
wvd_vegt 3:abbf43fab7d5 119 }
wvd_vegt 3:abbf43fab7d5 120
wvd_vegt 7:269c2445b8f5 121 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 122
wvd_vegt 7:269c2445b8f5 123 bool Cmdb::hasnext() {
wvd_vegt 7:269c2445b8f5 124 return serial.readable()==1;
wvd_vegt 7:269c2445b8f5 125 }
wvd_vegt 7:269c2445b8f5 126
wvd_vegt 7:269c2445b8f5 127 char Cmdb::next() {
wvd_vegt 7:269c2445b8f5 128 return serial.getc();
wvd_vegt 3:abbf43fab7d5 129 }
wvd_vegt 3:abbf43fab7d5 130
wvd_vegt 7:269c2445b8f5 131 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 132
wvd_vegt 7:269c2445b8f5 133 bool Cmdb::scan(const char c) {
wvd_vegt 7:269c2445b8f5 134 int i;
wvd_vegt 7:269c2445b8f5 135
wvd_vegt 7:269c2445b8f5 136 //See http://www.interfacebus.com/ASCII_Table.html
wvd_vegt 7:269c2445b8f5 137
wvd_vegt 7:269c2445b8f5 138 if (c == '\r') { // cr?
wvd_vegt 7:269c2445b8f5 139 print(crlf); // Output it and ...
wvd_vegt 7:269c2445b8f5 140 if (cmdndx) {
wvd_vegt 7:269c2445b8f5 141 strncpy(lstbuf,cmdbuf,cmdndx);
wvd_vegt 7:269c2445b8f5 142 lstbuf[cmdndx]='\0';
wvd_vegt 7:269c2445b8f5 143
wvd_vegt 7:269c2445b8f5 144 cmd_dispatcher(cmdbuf);
wvd_vegt 7:269c2445b8f5 145 }
wvd_vegt 7:269c2445b8f5 146 init(false);
wvd_vegt 7:269c2445b8f5 147 prompt();
wvd_vegt 7:269c2445b8f5 148
wvd_vegt 7:269c2445b8f5 149 return true;
wvd_vegt 7:269c2445b8f5 150 }
wvd_vegt 7:269c2445b8f5 151
wvd_vegt 7:269c2445b8f5 152 //TODO BACKSPACE NOT CORRECT FOR TELNET!
wvd_vegt 7:269c2445b8f5 153
wvd_vegt 7:269c2445b8f5 154 if (c == '\b') { // Backspace
wvd_vegt 7:269c2445b8f5 155 if (cmdndx != 0) {
wvd_vegt 7:269c2445b8f5 156 print(bs);
wvd_vegt 7:269c2445b8f5 157 cmdbuf [--cmdndx] = '\0';
wvd_vegt 7:269c2445b8f5 158 } else {
wvd_vegt 7:269c2445b8f5 159 printch(bell); // Output Error
wvd_vegt 7:269c2445b8f5 160 }
wvd_vegt 7:269c2445b8f5 161 return false;
wvd_vegt 7:269c2445b8f5 162 }
wvd_vegt 7:269c2445b8f5 163
wvd_vegt 7:269c2445b8f5 164 if (c == '\177') { // Delete
wvd_vegt 7:269c2445b8f5 165 while (cmdndx>0) {
wvd_vegt 7:269c2445b8f5 166 print(bs);
wvd_vegt 7:269c2445b8f5 167 cmdbuf [--cmdndx] = '\0';
wvd_vegt 7:269c2445b8f5 168 }
wvd_vegt 7:269c2445b8f5 169 return false;
wvd_vegt 7:269c2445b8f5 170 }
wvd_vegt 7:269c2445b8f5 171
wvd_vegt 7:269c2445b8f5 172 //Reset Escape Buffer.
wvd_vegt 7:269c2445b8f5 173 if (c == '\033') {
wvd_vegt 7:269c2445b8f5 174 if (escndx!=0) {
wvd_vegt 7:269c2445b8f5 175 //_putchar(bell); // Output Error
wvd_vegt 7:269c2445b8f5 176 //printf("%s\r\n",escbuf);
wvd_vegt 7:269c2445b8f5 177 }
wvd_vegt 7:269c2445b8f5 178 escndx = 0;
wvd_vegt 7:269c2445b8f5 179 escbuf [escndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 7:269c2445b8f5 180 }
wvd_vegt 7:269c2445b8f5 181
wvd_vegt 7:269c2445b8f5 182 //Extract Escape Sequence.
wvd_vegt 7:269c2445b8f5 183 if (c == '\033' || escndx ) { // Wait for escape
wvd_vegt 7:269c2445b8f5 184 escbuf [escndx++] = (unsigned char) c; // Add to the buffer
wvd_vegt 7:269c2445b8f5 185 escbuf [escndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 7:269c2445b8f5 186 if (isalpha(c)) {
wvd_vegt 7:269c2445b8f5 187 switch (escid_search(escbuf)) {
wvd_vegt 7:269c2445b8f5 188 case EID_CURSOR_LEFT : {
wvd_vegt 7:269c2445b8f5 189 if (cmdndx != 0) { // Backspace?
wvd_vegt 7:269c2445b8f5 190 print(bs);
wvd_vegt 7:269c2445b8f5 191 cmdbuf [--cmdndx] = '\0';
wvd_vegt 7:269c2445b8f5 192 } else {
wvd_vegt 7:269c2445b8f5 193 printch(bell); // Output char
wvd_vegt 7:269c2445b8f5 194 }
wvd_vegt 7:269c2445b8f5 195 break;
wvd_vegt 7:269c2445b8f5 196 }
wvd_vegt 7:269c2445b8f5 197 case EID_CURSOR_UP : {
wvd_vegt 17:7e6a723d65de 198 for (i=0; i<cmdndx; i++) {
wvd_vegt 7:269c2445b8f5 199 print(bs);
wvd_vegt 7:269c2445b8f5 200 }
wvd_vegt 7:269c2445b8f5 201 cmdndx=strlen(lstbuf);
wvd_vegt 7:269c2445b8f5 202 strncpy(cmdbuf,lstbuf,cmdndx);
wvd_vegt 7:269c2445b8f5 203 cmdbuf[cmdndx]='\0';
wvd_vegt 7:269c2445b8f5 204 printf("%s",cmdbuf);
wvd_vegt 7:269c2445b8f5 205 break;
wvd_vegt 7:269c2445b8f5 206 }
wvd_vegt 7:269c2445b8f5 207 case EID_CURSOR_RIGHT:
wvd_vegt 7:269c2445b8f5 208 break;
wvd_vegt 7:269c2445b8f5 209 case EID_CURSOR_DOWN :
wvd_vegt 7:269c2445b8f5 210 break;
wvd_vegt 7:269c2445b8f5 211 case EID_LAST :
wvd_vegt 7:269c2445b8f5 212 break;
wvd_vegt 7:269c2445b8f5 213 default :
wvd_vegt 7:269c2445b8f5 214 printch(bell);
wvd_vegt 7:269c2445b8f5 215 break;
wvd_vegt 7:269c2445b8f5 216 }
wvd_vegt 7:269c2445b8f5 217 escndx=0;
wvd_vegt 7:269c2445b8f5 218 escbuf [escndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 7:269c2445b8f5 219 }
wvd_vegt 7:269c2445b8f5 220 return false;
wvd_vegt 7:269c2445b8f5 221 }
wvd_vegt 7:269c2445b8f5 222
wvd_vegt 7:269c2445b8f5 223 if (c=='\n') { // LF
wvd_vegt 7:269c2445b8f5 224 return false; // Dump it
wvd_vegt 7:269c2445b8f5 225 }
wvd_vegt 7:269c2445b8f5 226
wvd_vegt 7:269c2445b8f5 227 if (!isprint (c)) { // Printable character?
wvd_vegt 7:269c2445b8f5 228 printch(bell);
wvd_vegt 7:269c2445b8f5 229 return false;
wvd_vegt 7:269c2445b8f5 230 }
wvd_vegt 7:269c2445b8f5 231
wvd_vegt 7:269c2445b8f5 232 if (cmdndx >= MAX_CMD_LEN) { // Past buffer length?
wvd_vegt 7:269c2445b8f5 233 printch(bell);
wvd_vegt 7:269c2445b8f5 234 return false;
wvd_vegt 7:269c2445b8f5 235 }
wvd_vegt 7:269c2445b8f5 236
wvd_vegt 7:269c2445b8f5 237 cmdbuf [cmdndx++] = (unsigned char) c; // Add to the buffer
wvd_vegt 7:269c2445b8f5 238 cmdbuf [cmdndx] = '\0'; // NULL-Terminate buffer
wvd_vegt 7:269c2445b8f5 239
wvd_vegt 7:269c2445b8f5 240 if (echo) {
wvd_vegt 7:269c2445b8f5 241 printch(c); // Output char
wvd_vegt 7:269c2445b8f5 242 }
wvd_vegt 7:269c2445b8f5 243
wvd_vegt 7:269c2445b8f5 244 return false;
wvd_vegt 3:abbf43fab7d5 245 }
wvd_vegt 3:abbf43fab7d5 246
wvd_vegt 7:269c2445b8f5 247 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 248
wvd_vegt 7:269c2445b8f5 249 int Cmdb::printf(const char *format, ...) {
wvd_vegt 7:269c2445b8f5 250 int cnt;
wvd_vegt 7:269c2445b8f5 251
wvd_vegt 7:269c2445b8f5 252 va_list args;
wvd_vegt 7:269c2445b8f5 253 char buf[1024];
wvd_vegt 7:269c2445b8f5 254
wvd_vegt 7:269c2445b8f5 255 memset(buf,'\0',sizeof(buf));
wvd_vegt 7:269c2445b8f5 256
wvd_vegt 7:269c2445b8f5 257 va_start(args, format);
wvd_vegt 7:269c2445b8f5 258 cnt = vsnprintf(buf, sizeof(buf), format, args);
wvd_vegt 7:269c2445b8f5 259 if (cnt==-1) {
wvd_vegt 7:269c2445b8f5 260 //Error
wvd_vegt 7:269c2445b8f5 261 }
wvd_vegt 7:269c2445b8f5 262 va_end(args);
wvd_vegt 7:269c2445b8f5 263
wvd_vegt 7:269c2445b8f5 264 return print(buf);
wvd_vegt 7:269c2445b8f5 265 }
wvd_vegt 7:269c2445b8f5 266
wvd_vegt 7:269c2445b8f5 267 int Cmdb::print(const char *msg) {
wvd_vegt 7:269c2445b8f5 268 return serial.printf(msg);
wvd_vegt 7:269c2445b8f5 269 }
wvd_vegt 7:269c2445b8f5 270
wvd_vegt 18:7a4dc478d022 271 int Cmdb::printsection(const char *section) {
wvd_vegt 18:7a4dc478d022 272 return printf("[%s]\r\n", section);
wvd_vegt 18:7a4dc478d022 273 }
wvd_vegt 18:7a4dc478d022 274
wvd_vegt 18:7a4dc478d022 275 int Cmdb::printvaluef(const char *key, const char *format, ...) {
wvd_vegt 18:7a4dc478d022 276 char buf[256];
wvd_vegt 18:7a4dc478d022 277
wvd_vegt 18:7a4dc478d022 278 va_list args;
wvd_vegt 18:7a4dc478d022 279 va_start(args, format);
wvd_vegt 18:7a4dc478d022 280
wvd_vegt 18:7a4dc478d022 281 vsnprintf(buf, sizeof(buf), format, args);
wvd_vegt 18:7a4dc478d022 282
wvd_vegt 18:7a4dc478d022 283 va_end(args);
wvd_vegt 18:7a4dc478d022 284
wvd_vegt 18:7a4dc478d022 285 return printf("%s=%s\r\n",key, buf);
wvd_vegt 18:7a4dc478d022 286 }
wvd_vegt 18:7a4dc478d022 287
wvd_vegt 18:7a4dc478d022 288 int Cmdb::printvaluef(const char *key, const int width, const char *comment, const char *format, ...) {
wvd_vegt 18:7a4dc478d022 289 printf("%s=",key);
wvd_vegt 18:7a4dc478d022 290
wvd_vegt 18:7a4dc478d022 291 int result = 0;
wvd_vegt 18:7a4dc478d022 292 char buf[256];
wvd_vegt 18:7a4dc478d022 293 int cnt = 0;
wvd_vegt 18:7a4dc478d022 294
wvd_vegt 18:7a4dc478d022 295 va_list args;
wvd_vegt 18:7a4dc478d022 296 va_start(args, format);
wvd_vegt 18:7a4dc478d022 297
wvd_vegt 18:7a4dc478d022 298 cnt = vsnprintf(buf, sizeof(buf), format, args);
wvd_vegt 18:7a4dc478d022 299 cnt +=strlen(key)+1;
wvd_vegt 18:7a4dc478d022 300
wvd_vegt 18:7a4dc478d022 301 va_end(args);
wvd_vegt 18:7a4dc478d022 302
wvd_vegt 18:7a4dc478d022 303 if (comment!=NULL) {
wvd_vegt 18:7a4dc478d022 304 if (cnt<width) {
wvd_vegt 18:7a4dc478d022 305 result = printf("%-*s ;%s\r\n", width, buf, comment);
wvd_vegt 18:7a4dc478d022 306 } else {
wvd_vegt 18:7a4dc478d022 307 result = printf("%s ;%s\r\n", buf, comment);
wvd_vegt 18:7a4dc478d022 308 }
wvd_vegt 18:7a4dc478d022 309 } else {
wvd_vegt 18:7a4dc478d022 310 result = printf("%s\r\n",buf);
wvd_vegt 18:7a4dc478d022 311 }
wvd_vegt 18:7a4dc478d022 312
wvd_vegt 18:7a4dc478d022 313 return result;
wvd_vegt 18:7a4dc478d022 314 }
wvd_vegt 18:7a4dc478d022 315
wvd_vegt 18:7a4dc478d022 316 int Cmdb::printvalue(const char *key, const char *value, const char *comment, const int width) {
wvd_vegt 18:7a4dc478d022 317 if (comment) {
wvd_vegt 18:7a4dc478d022 318 char buf[256];
wvd_vegt 18:7a4dc478d022 319 int cnt = 0;
wvd_vegt 18:7a4dc478d022 320
wvd_vegt 18:7a4dc478d022 321 memset(buf,'\0',sizeof(buf));
wvd_vegt 18:7a4dc478d022 322
wvd_vegt 18:7a4dc478d022 323 cnt = snprintf(buf, sizeof(buf), "%s=%s", key, value);
wvd_vegt 18:7a4dc478d022 324
wvd_vegt 18:7a4dc478d022 325 if (cnt<width) {
wvd_vegt 18:7a4dc478d022 326 return printf("%-*s ;%s\r\n", width, buf, comment);
wvd_vegt 18:7a4dc478d022 327 } else {
wvd_vegt 18:7a4dc478d022 328 return printf("%s ;%s\r\n", buf, comment);
wvd_vegt 18:7a4dc478d022 329 }
wvd_vegt 18:7a4dc478d022 330 } else {
wvd_vegt 18:7a4dc478d022 331 return printf("%s=%s\r\n", key, value);
wvd_vegt 18:7a4dc478d022 332 }
wvd_vegt 18:7a4dc478d022 333 }
wvd_vegt 18:7a4dc478d022 334
wvd_vegt 7:269c2445b8f5 335 char Cmdb::printch(const char ch) {
wvd_vegt 7:269c2445b8f5 336 return serial.putc(ch);
wvd_vegt 7:269c2445b8f5 337 }
wvd_vegt 3:abbf43fab7d5 338
wvd_vegt 7:269c2445b8f5 339 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 340
wvd_vegt 7:269c2445b8f5 341 void Cmdb::init(const char full) {
wvd_vegt 7:269c2445b8f5 342 if (full) {
wvd_vegt 7:269c2445b8f5 343 echo = true;
wvd_vegt 7:269c2445b8f5 344 bold = true;
wvd_vegt 7:269c2445b8f5 345
wvd_vegt 7:269c2445b8f5 346 subsystem = -1;
wvd_vegt 7:269c2445b8f5 347
wvd_vegt 7:269c2445b8f5 348 lstbuf [cmdndx] = '\0';
wvd_vegt 7:269c2445b8f5 349
wvd_vegt 7:269c2445b8f5 350 macro_reset();
wvd_vegt 7:269c2445b8f5 351
wvd_vegt 7:269c2445b8f5 352 prompt();
wvd_vegt 7:269c2445b8f5 353 }
wvd_vegt 7:269c2445b8f5 354
wvd_vegt 7:269c2445b8f5 355 cmdndx = 0;
wvd_vegt 7:269c2445b8f5 356 cmdbuf [cmdndx] = '\0';
wvd_vegt 7:269c2445b8f5 357
wvd_vegt 7:269c2445b8f5 358 escndx = 0;
wvd_vegt 7:269c2445b8f5 359 escbuf [escndx] = '\0';
wvd_vegt 7:269c2445b8f5 360 }
wvd_vegt 7:269c2445b8f5 361
wvd_vegt 7:269c2445b8f5 362 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 363 //Private Stuff.
wvd_vegt 7:269c2445b8f5 364 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 365
wvd_vegt 7:269c2445b8f5 366 int Cmdb::escid_search(char *escstr) {
wvd_vegt 3:abbf43fab7d5 367 for (int i=0; i<ESC_TBL_LEN; i++) {
wvd_vegt 3:abbf43fab7d5 368 if (strcmp (esc_tbl[i].escstr, escstr) == 0)
wvd_vegt 3:abbf43fab7d5 369 return (esc_tbl[i].id);
wvd_vegt 3:abbf43fab7d5 370 }
wvd_vegt 3:abbf43fab7d5 371
wvd_vegt 3:abbf43fab7d5 372 return (EID_LAST);
wvd_vegt 3:abbf43fab7d5 373 }
wvd_vegt 3:abbf43fab7d5 374
wvd_vegt 7:269c2445b8f5 375 int Cmdb::cmdid_search(char *cmdstr) {
wvd_vegt 3:abbf43fab7d5 376 //Warning, we return the ID but somewhere assume it's equal to the array index!
wvd_vegt 7:269c2445b8f5 377 for (int i=0; i<cmds.size(); i++) {
wvd_vegt 18:7a4dc478d022 378 if ((stricmp((char*)cmds[i].cmdstr, cmdstr) == 0) && ((cmds[i].subs == subsystem) || (cmds[i].subs<0)))
wvd_vegt 7:269c2445b8f5 379 return (cmds[i].cid);
wvd_vegt 3:abbf43fab7d5 380 }
wvd_vegt 3:abbf43fab7d5 381
wvd_vegt 6:76b033971c3c 382 return CID_LAST;
wvd_vegt 3:abbf43fab7d5 383 }
wvd_vegt 3:abbf43fab7d5 384
wvd_vegt 7:269c2445b8f5 385 int Cmdb::cmdid_index(int cmdid) {
wvd_vegt 7:269c2445b8f5 386 for (int i=0; i<cmds.size(); i++) {
wvd_vegt 7:269c2445b8f5 387 if (cmds[i].cid==cmdid)
wvd_vegt 3:abbf43fab7d5 388 return i;
wvd_vegt 3:abbf43fab7d5 389 }
wvd_vegt 3:abbf43fab7d5 390
wvd_vegt 3:abbf43fab7d5 391 return -1;
wvd_vegt 3:abbf43fab7d5 392 }
wvd_vegt 3:abbf43fab7d5 393
wvd_vegt 7:269c2445b8f5 394 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 395
wvd_vegt 7:269c2445b8f5 396 int Cmdb::parse(char *cmd) {
wvd_vegt 3:abbf43fab7d5 397 //Command
wvd_vegt 3:abbf43fab7d5 398 char cmdstr_buf [1 + MAX_CMD_LEN];
wvd_vegt 3:abbf43fab7d5 399
wvd_vegt 3:abbf43fab7d5 400 //Parameters
wvd_vegt 3:abbf43fab7d5 401 char argstr_buf [1 + MAX_CMD_LEN];
wvd_vegt 3:abbf43fab7d5 402 char *argsep;
wvd_vegt 3:abbf43fab7d5 403
wvd_vegt 3:abbf43fab7d5 404 char prmstr_buf [1 + MAX_CMD_LEN]; //copy of sscanf pattern
wvd_vegt 3:abbf43fab7d5 405 char *tok; //current token
wvd_vegt 3:abbf43fab7d5 406 void *toks[MAX_ARGS]; //pointers to string tokens IN commandline (argstr_buf)
wvd_vegt 3:abbf43fab7d5 407 char *prms[MAX_ARGS]; //patterns IN copy of sscanf string (*parms)
wvd_vegt 3:abbf43fab7d5 408
wvd_vegt 3:abbf43fab7d5 409 char typ = '\0'; //Var type
wvd_vegt 3:abbf43fab7d5 410 char mod = '\0'; //Var modifier (for cardinal types)
wvd_vegt 3:abbf43fab7d5 411 unsigned int base; //Var number base (8,10,16)
wvd_vegt 3:abbf43fab7d5 412 //unsigned int bytes; //Var size in bytes (used for malloc)
wvd_vegt 3:abbf43fab7d5 413
wvd_vegt 3:abbf43fab7d5 414 float f; //Temp var for conversion, 4 bytes
wvd_vegt 3:abbf43fab7d5 415 //unsigned char b; //Temp var for conversion, 1 byte
wvd_vegt 3:abbf43fab7d5 416 //char c; //Temp var for conversion, 1 byte
wvd_vegt 3:abbf43fab7d5 417 //short h; //Temp var for conversion, 2 bytes
wvd_vegt 3:abbf43fab7d5 418 //int k; //Temp var for conversion, 2 bytes
wvd_vegt 3:abbf43fab7d5 419 long l; //Temp var for conversion, 4 bytes
wvd_vegt 3:abbf43fab7d5 420
wvd_vegt 3:abbf43fab7d5 421 char* endptr; //strtoXX() Error detection
wvd_vegt 3:abbf43fab7d5 422
wvd_vegt 6:76b033971c3c 423 int cid = -1; //Signals empty string...
wvd_vegt 6:76b033971c3c 424 int ndx = -1;
wvd_vegt 3:abbf43fab7d5 425
wvd_vegt 3:abbf43fab7d5 426 //Init (global) variables.
wvd_vegt 3:abbf43fab7d5 427 argfnd=0;
wvd_vegt 3:abbf43fab7d5 428 argcnt=0;
wvd_vegt 3:abbf43fab7d5 429 error =0;
wvd_vegt 3:abbf43fab7d5 430
wvd_vegt 3:abbf43fab7d5 431 //Zero the two string buffers for splitting cmd string into.
wvd_vegt 3:abbf43fab7d5 432 zeromemory((char*)cmdstr_buf,sizeof(cmdstr_buf));
wvd_vegt 3:abbf43fab7d5 433 zeromemory(argstr_buf,sizeof(argstr_buf));
wvd_vegt 3:abbf43fab7d5 434
wvd_vegt 3:abbf43fab7d5 435 //Make it worse in Lint
wvd_vegt 17:7e6a723d65de 436 for (int i=0; i<MAX_ARGS; i++) {
wvd_vegt 3:abbf43fab7d5 437 parms[i].type=PARM_UNUSED;
wvd_vegt 3:abbf43fab7d5 438 zeromemory((char*)&(parms[i].val),sizeof(parms[i].val));
wvd_vegt 3:abbf43fab7d5 439 }
wvd_vegt 3:abbf43fab7d5 440
wvd_vegt 3:abbf43fab7d5 441 /*------------------------------------------------
wvd_vegt 3:abbf43fab7d5 442 First, copy the command and convert it to all
wvd_vegt 3:abbf43fab7d5 443 uppercase.
wvd_vegt 3:abbf43fab7d5 444 ------------------------------------------------*/
wvd_vegt 3:abbf43fab7d5 445
wvd_vegt 3:abbf43fab7d5 446 strncpy(cmdstr_buf, cmd, sizeof (cmdstr_buf) - 1);
wvd_vegt 3:abbf43fab7d5 447 cmdstr_buf [sizeof (cmdstr_buf) - 1] = '\0';
wvd_vegt 3:abbf43fab7d5 448
wvd_vegt 3:abbf43fab7d5 449 /*------------------------------------------------
wvd_vegt 3:abbf43fab7d5 450 Next, find the end of the first thing in the
wvd_vegt 3:abbf43fab7d5 451 buffer. Since the command ends with a space,
wvd_vegt 3:abbf43fab7d5 452 we'll look for that. NULL-Terminate the command
wvd_vegt 3:abbf43fab7d5 453 and keep a pointer to the arguments.
wvd_vegt 3:abbf43fab7d5 454 ------------------------------------------------*/
wvd_vegt 3:abbf43fab7d5 455
wvd_vegt 3:abbf43fab7d5 456 argsep = strchr(cmdstr_buf, ' ');
wvd_vegt 3:abbf43fab7d5 457
wvd_vegt 3:abbf43fab7d5 458 if (argsep == NULL) {
wvd_vegt 3:abbf43fab7d5 459 argstr_buf [0] = '\0';
wvd_vegt 3:abbf43fab7d5 460 } else {
wvd_vegt 3:abbf43fab7d5 461 strcpy (argstr_buf, argsep + 1);
wvd_vegt 3:abbf43fab7d5 462 *argsep = '\0';
wvd_vegt 3:abbf43fab7d5 463 }
wvd_vegt 3:abbf43fab7d5 464
wvd_vegt 3:abbf43fab7d5 465 /*------------------------------------------------
wvd_vegt 6:76b033971c3c 466 Search for a command ID, then switch on it.
wvd_vegt 3:abbf43fab7d5 467 ------------------------------------------------*/
wvd_vegt 3:abbf43fab7d5 468
wvd_vegt 3:abbf43fab7d5 469 //1) Find the Command Id
wvd_vegt 7:269c2445b8f5 470 cid = cmdid_search(cmdstr_buf);
wvd_vegt 3:abbf43fab7d5 471
wvd_vegt 6:76b033971c3c 472 if (cid!=CID_LAST) {
wvd_vegt 3:abbf43fab7d5 473 //2) Tokenize a copy of the parms from the cmd_tbl.
wvd_vegt 3:abbf43fab7d5 474
wvd_vegt 7:269c2445b8f5 475 ndx = cmdid_index(cid);
wvd_vegt 6:76b033971c3c 476
wvd_vegt 3:abbf43fab7d5 477 //Get Format patterns from cmd_tbl[id].parms.
wvd_vegt 7:269c2445b8f5 478 //note: strtok inserts \0 into the original string. Hence the copy.
wvd_vegt 3:abbf43fab7d5 479 zeromemory((char *)(&prmstr_buf),sizeof(prmstr_buf));
wvd_vegt 3:abbf43fab7d5 480
wvd_vegt 7:269c2445b8f5 481 strncpy (prmstr_buf, cmds[ndx].parms, sizeof (prmstr_buf) - 1);
wvd_vegt 3:abbf43fab7d5 482
wvd_vegt 3:abbf43fab7d5 483 argcnt=0;
wvd_vegt 3:abbf43fab7d5 484 tok = strtok(prmstr_buf, " ");
wvd_vegt 3:abbf43fab7d5 485 while (tok != NULL) {
wvd_vegt 3:abbf43fab7d5 486 //Store Pointers
wvd_vegt 3:abbf43fab7d5 487 prms[argcnt++] = tok;
wvd_vegt 3:abbf43fab7d5 488
wvd_vegt 7:269c2445b8f5 489 //printf("prm_%2.2d='%s'\r\n",argcnt, tok);
wvd_vegt 3:abbf43fab7d5 490
wvd_vegt 3:abbf43fab7d5 491 tok = strtok(NULL, " ");
wvd_vegt 3:abbf43fab7d5 492 }
wvd_vegt 3:abbf43fab7d5 493
wvd_vegt 3:abbf43fab7d5 494 //3) Tokenize the commandline.
wvd_vegt 3:abbf43fab7d5 495
wvd_vegt 3:abbf43fab7d5 496 //Get Tokens from arguments.
wvd_vegt 3:abbf43fab7d5 497 //Note: strtok inserts \0 into the original string. Won't harm here as we do not re-use it.
wvd_vegt 3:abbf43fab7d5 498
wvd_vegt 3:abbf43fab7d5 499 argfnd=0;
wvd_vegt 3:abbf43fab7d5 500
wvd_vegt 3:abbf43fab7d5 501 if (strlen(argstr_buf)!=0) {
wvd_vegt 3:abbf43fab7d5 502 tok = strtok(argstr_buf, " ");
wvd_vegt 3:abbf43fab7d5 503 } else {
wvd_vegt 3:abbf43fab7d5 504 tok=NULL;
wvd_vegt 3:abbf43fab7d5 505 }
wvd_vegt 3:abbf43fab7d5 506
wvd_vegt 3:abbf43fab7d5 507 while (tok != NULL) {
wvd_vegt 3:abbf43fab7d5 508 //Store Pointers
wvd_vegt 3:abbf43fab7d5 509 toks[argfnd++]=tok;
wvd_vegt 3:abbf43fab7d5 510
wvd_vegt 7:269c2445b8f5 511 //printf("tok_%2.2d='%s'\r\n",argfnd, tok);
wvd_vegt 3:abbf43fab7d5 512
wvd_vegt 3:abbf43fab7d5 513 tok = strtok(NULL, " ");
wvd_vegt 3:abbf43fab7d5 514 }
wvd_vegt 3:abbf43fab7d5 515
wvd_vegt 6:76b033971c3c 516 if (argfnd==argcnt || (cid==CID_HELP && argfnd==0)) {
wvd_vegt 3:abbf43fab7d5 517
wvd_vegt 3:abbf43fab7d5 518 error = 0;
wvd_vegt 3:abbf43fab7d5 519
wvd_vegt 17:7e6a723d65de 520 for (int i=0; i<argcnt; i++) {
wvd_vegt 7:269c2445b8f5 521 //printf("prm_%2.2d=%s\r\n",i, prms[i]);
wvd_vegt 3:abbf43fab7d5 522
wvd_vegt 3:abbf43fab7d5 523 switch (strlen(prms[i])) {
wvd_vegt 3:abbf43fab7d5 524 case 0:
wvd_vegt 3:abbf43fab7d5 525 break;
wvd_vegt 3:abbf43fab7d5 526 case 1:
wvd_vegt 3:abbf43fab7d5 527 break;
wvd_vegt 3:abbf43fab7d5 528 case 2: //Simple pattern, no modifier
wvd_vegt 3:abbf43fab7d5 529 mod='\0';
wvd_vegt 3:abbf43fab7d5 530 typ=prms[i][1];
wvd_vegt 3:abbf43fab7d5 531
wvd_vegt 3:abbf43fab7d5 532 break;
wvd_vegt 3:abbf43fab7d5 533 case 3: //pattern with Modifier.
wvd_vegt 3:abbf43fab7d5 534 mod=prms[i][1];
wvd_vegt 3:abbf43fab7d5 535 typ=prms[i][2];
wvd_vegt 3:abbf43fab7d5 536
wvd_vegt 3:abbf43fab7d5 537 break;
wvd_vegt 3:abbf43fab7d5 538 default:
wvd_vegt 3:abbf43fab7d5 539 break;
wvd_vegt 3:abbf43fab7d5 540 }
wvd_vegt 3:abbf43fab7d5 541
wvd_vegt 3:abbf43fab7d5 542 switch (typ) {
wvd_vegt 3:abbf43fab7d5 543 case 'o' :
wvd_vegt 3:abbf43fab7d5 544 base=8;
wvd_vegt 3:abbf43fab7d5 545 break;
wvd_vegt 3:abbf43fab7d5 546 case 'x' :
wvd_vegt 3:abbf43fab7d5 547 base=16;
wvd_vegt 3:abbf43fab7d5 548 break;
wvd_vegt 3:abbf43fab7d5 549 default:
wvd_vegt 3:abbf43fab7d5 550 base=10;
wvd_vegt 3:abbf43fab7d5 551 break;
wvd_vegt 3:abbf43fab7d5 552 }
wvd_vegt 3:abbf43fab7d5 553
wvd_vegt 3:abbf43fab7d5 554 endptr = (char*)toks[i];
wvd_vegt 3:abbf43fab7d5 555
wvd_vegt 3:abbf43fab7d5 556 //Cardinal Types
wvd_vegt 3:abbf43fab7d5 557 switch (typ) {
wvd_vegt 3:abbf43fab7d5 558 case 'd' : //Check mod
wvd_vegt 3:abbf43fab7d5 559 case 'i' : //Check mod
wvd_vegt 3:abbf43fab7d5 560 case 'u' : //Check mod
wvd_vegt 3:abbf43fab7d5 561 case 'o' : //Check mod
wvd_vegt 3:abbf43fab7d5 562 case 'x' : //Check mod
wvd_vegt 3:abbf43fab7d5 563 switch (mod) {
wvd_vegt 3:abbf43fab7d5 564 case 'b' : //char
wvd_vegt 3:abbf43fab7d5 565 //test range
wvd_vegt 3:abbf43fab7d5 566 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 3:abbf43fab7d5 567 if (l>=MIN_BYTE && l<=MAX_BYTE) {
wvd_vegt 3:abbf43fab7d5 568 parms[i].type=PARM_CHAR;
wvd_vegt 3:abbf43fab7d5 569 parms[i].val.uc =(unsigned char)l;
wvd_vegt 3:abbf43fab7d5 570 } else {
wvd_vegt 3:abbf43fab7d5 571 error = i+1;
wvd_vegt 3:abbf43fab7d5 572 }
wvd_vegt 3:abbf43fab7d5 573
wvd_vegt 3:abbf43fab7d5 574 break;
wvd_vegt 3:abbf43fab7d5 575 case 'h' : //short
wvd_vegt 3:abbf43fab7d5 576 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 3:abbf43fab7d5 577 if (l>=MIN_SHORT && l<=MAX_SHORT) {
wvd_vegt 3:abbf43fab7d5 578 parms[i].type=PARM_SHORT;
wvd_vegt 3:abbf43fab7d5 579 parms[i].val.w=(short)l;
wvd_vegt 3:abbf43fab7d5 580 } else {
wvd_vegt 3:abbf43fab7d5 581 error = i+1;
wvd_vegt 3:abbf43fab7d5 582 }
wvd_vegt 3:abbf43fab7d5 583
wvd_vegt 3:abbf43fab7d5 584 break;
wvd_vegt 3:abbf43fab7d5 585 case 'l' : //long
wvd_vegt 3:abbf43fab7d5 586 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 3:abbf43fab7d5 587 parms[i].type=PARM_LONG;
wvd_vegt 3:abbf43fab7d5 588 parms[i].val.l=l;
wvd_vegt 3:abbf43fab7d5 589
wvd_vegt 3:abbf43fab7d5 590 break;
wvd_vegt 7:269c2445b8f5 591 default: //int
wvd_vegt 3:abbf43fab7d5 592 l=strtol((char*)toks[i], &endptr, base);
wvd_vegt 3:abbf43fab7d5 593 if (l>=MIN_INT && l<=MAX_INT) {
wvd_vegt 3:abbf43fab7d5 594 parms[i].type=PARM_INT;
wvd_vegt 3:abbf43fab7d5 595 parms[i].val.l=(int)l;
wvd_vegt 3:abbf43fab7d5 596 } else {
wvd_vegt 3:abbf43fab7d5 597 error = i+1;
wvd_vegt 3:abbf43fab7d5 598 }
wvd_vegt 3:abbf43fab7d5 599 break;
wvd_vegt 3:abbf43fab7d5 600 }
wvd_vegt 3:abbf43fab7d5 601
wvd_vegt 3:abbf43fab7d5 602 if (error==0 &&
wvd_vegt 3:abbf43fab7d5 603 (endptr==toks[i] //No Conversion at all.
wvd_vegt 3:abbf43fab7d5 604 || *endptr)) { //Incomplete conversion.
wvd_vegt 3:abbf43fab7d5 605 error = i+1;
wvd_vegt 3:abbf43fab7d5 606 }
wvd_vegt 3:abbf43fab7d5 607
wvd_vegt 3:abbf43fab7d5 608 break;
wvd_vegt 3:abbf43fab7d5 609 }
wvd_vegt 3:abbf43fab7d5 610
wvd_vegt 3:abbf43fab7d5 611 //Floating Point Types
wvd_vegt 3:abbf43fab7d5 612 switch (typ) {
wvd_vegt 3:abbf43fab7d5 613 case 'e' :
wvd_vegt 3:abbf43fab7d5 614 case 'f' :
wvd_vegt 3:abbf43fab7d5 615 case 'g' :
wvd_vegt 3:abbf43fab7d5 616 f = strtod((char*)toks[i], &endptr);
wvd_vegt 3:abbf43fab7d5 617
wvd_vegt 3:abbf43fab7d5 618 parms[i].type=PARM_FLOAT;
wvd_vegt 3:abbf43fab7d5 619 parms[i].val.f=f;
wvd_vegt 3:abbf43fab7d5 620
wvd_vegt 3:abbf43fab7d5 621 if (error==0 &&
wvd_vegt 3:abbf43fab7d5 622 (endptr==toks[i] //No Conversion at all.
wvd_vegt 3:abbf43fab7d5 623 || *endptr)) { //Incomplete conversion.
wvd_vegt 3:abbf43fab7d5 624 error = i;
wvd_vegt 3:abbf43fab7d5 625 }
wvd_vegt 3:abbf43fab7d5 626
wvd_vegt 3:abbf43fab7d5 627 break;
wvd_vegt 3:abbf43fab7d5 628 }
wvd_vegt 3:abbf43fab7d5 629
wvd_vegt 3:abbf43fab7d5 630 //String types
wvd_vegt 3:abbf43fab7d5 631 switch (typ) {
wvd_vegt 3:abbf43fab7d5 632 case 'c' :
wvd_vegt 3:abbf43fab7d5 633 parms[i].type=PARM_CHAR;
wvd_vegt 3:abbf43fab7d5 634 parms[i].val.c=((char*)toks[i])[0];
wvd_vegt 3:abbf43fab7d5 635
wvd_vegt 3:abbf43fab7d5 636 if (error==0 && strlen((char*)toks[i])!=1) { //Incomplete conversion.
wvd_vegt 3:abbf43fab7d5 637 error = i;
wvd_vegt 3:abbf43fab7d5 638 }
wvd_vegt 3:abbf43fab7d5 639
wvd_vegt 3:abbf43fab7d5 640 break;
wvd_vegt 3:abbf43fab7d5 641
wvd_vegt 3:abbf43fab7d5 642 case 's' :
wvd_vegt 3:abbf43fab7d5 643 parms[i].type=PARM_STRING;
wvd_vegt 3:abbf43fab7d5 644 strncpy(parms[i].val.s,(char*)toks[i], strlen((char*)toks[i]));
wvd_vegt 3:abbf43fab7d5 645
wvd_vegt 3:abbf43fab7d5 646 break;
wvd_vegt 3:abbf43fab7d5 647 }
wvd_vegt 3:abbf43fab7d5 648 }
wvd_vegt 3:abbf43fab7d5 649 } else {
wvd_vegt 14:c652ce068f6c 650 //cid=CID_LAST;
wvd_vegt 3:abbf43fab7d5 651 }
wvd_vegt 3:abbf43fab7d5 652 }
wvd_vegt 3:abbf43fab7d5 653
wvd_vegt 6:76b033971c3c 654 return cid;
wvd_vegt 3:abbf43fab7d5 655 }
wvd_vegt 3:abbf43fab7d5 656
wvd_vegt 7:269c2445b8f5 657 //------------------------------------------------------------------------------
wvd_vegt 7:269c2445b8f5 658
wvd_vegt 7:269c2445b8f5 659 void Cmdb::cmd_dispatcher(char *cmd) {
wvd_vegt 3:abbf43fab7d5 660 int cid;
wvd_vegt 3:abbf43fab7d5 661 int ndx;
wvd_vegt 3:abbf43fab7d5 662
wvd_vegt 7:269c2445b8f5 663 cid = parse(cmd);
wvd_vegt 7:269c2445b8f5 664 ndx = cmdid_index(cid);
wvd_vegt 3:abbf43fab7d5 665
wvd_vegt 3:abbf43fab7d5 666 if (cid!=-1) {
wvd_vegt 7:269c2445b8f5 667 //printf("cmds[%d]=%d\r\n",ndx, cid);
wvd_vegt 3:abbf43fab7d5 668
wvd_vegt 3:abbf43fab7d5 669 /*------------------------------------------------
wvd_vegt 3:abbf43fab7d5 670 Process the command and it's arguments that are
wvd_vegt 3:abbf43fab7d5 671 found. id contains the command id and argcnt &
wvd_vegt 3:abbf43fab7d5 672 argfnd the number of found and expected paramaters
wvd_vegt 3:abbf43fab7d5 673 parms contains the parsed argument values and their
wvd_vegt 3:abbf43fab7d5 674 types.
wvd_vegt 3:abbf43fab7d5 675 ------------------------------------------------*/
wvd_vegt 3:abbf43fab7d5 676
wvd_vegt 14:c652ce068f6c 677 //printf("cmds[%d]=%d\r\n",ndx, cid);
wvd_vegt 14:c652ce068f6c 678
wvd_vegt 3:abbf43fab7d5 679 if (cid==CID_LAST) {
wvd_vegt 7:269c2445b8f5 680 print("Unknown command, type 'Help' for a list of available commands.\r\n");
wvd_vegt 3:abbf43fab7d5 681 } else {
wvd_vegt 9:dc9faec79298 682 //printf("cmds[%d]=%d [%s]\r\n",ndx, cid, cmds[ndx].cmdstr);
wvd_vegt 3:abbf43fab7d5 683
wvd_vegt 3:abbf43fab7d5 684 //Test for more commandline than allowed too.
wvd_vegt 3:abbf43fab7d5 685 //i.e. run 1 is wrong.
wvd_vegt 3:abbf43fab7d5 686
wvd_vegt 7:269c2445b8f5 687 if (argcnt==0 && argfnd==0 && error==0 && ndx!=-1 && cmds[ndx].subs==SUBSYSTEM) {
wvd_vegt 6:76b033971c3c 688 //Handle all SubSystems.
wvd_vegt 3:abbf43fab7d5 689 subsystem=cid;
wvd_vegt 3:abbf43fab7d5 690 } else if ( ((cid==CID_HELP) || (argcnt==argfnd)) && error==0 ) {
wvd_vegt 3:abbf43fab7d5 691 switch (cid) {
wvd_vegt 3:abbf43fab7d5 692
wvd_vegt 7:269c2445b8f5 693 #ifdef ENABLEMACROS
wvd_vegt 3:abbf43fab7d5 694 /////// GLOBAL MACRO COMMANDS ///////
wvd_vegt 3:abbf43fab7d5 695
wvd_vegt 3:abbf43fab7d5 696 //Define Macro from commandline
wvd_vegt 3:abbf43fab7d5 697 case CID_MACRO:
wvd_vegt 3:abbf43fab7d5 698 macro_ptr=-1;
wvd_vegt 9:dc9faec79298 699
wvd_vegt 8:83edd6addbd5 700 zeromemory((char*)macro_buf, sizeof(macro_buf));
wvd_vegt 3:abbf43fab7d5 701 strncpy(macro_buf, STRINGPARM(0), sizeof(macro_buf) - 1);
wvd_vegt 9:dc9faec79298 702
wvd_vegt 8:83edd6addbd5 703 //DEBUG
wvd_vegt 8:83edd6addbd5 704 printf("Macro=%s\r\n",macro_buf);
wvd_vegt 3:abbf43fab7d5 705 break;
wvd_vegt 3:abbf43fab7d5 706
wvd_vegt 3:abbf43fab7d5 707 //Run Macro
wvd_vegt 3:abbf43fab7d5 708 case CID_RUN:
wvd_vegt 3:abbf43fab7d5 709 macro_ptr=0;
wvd_vegt 3:abbf43fab7d5 710 break;
wvd_vegt 3:abbf43fab7d5 711
wvd_vegt 3:abbf43fab7d5 712 //List Macro's
wvd_vegt 3:abbf43fab7d5 713 case CID_MACROS:
wvd_vegt 7:269c2445b8f5 714 print("[Macro]\r\n");
wvd_vegt 8:83edd6addbd5 715 if (macro_buf[0]!='\0') {
wvd_vegt 7:269c2445b8f5 716 printf("Value=%s\r\n",macro_buf);
wvd_vegt 3:abbf43fab7d5 717 } else {
wvd_vegt 7:269c2445b8f5 718 printf(";No Macro Defined\r\n");
wvd_vegt 3:abbf43fab7d5 719 }
wvd_vegt 3:abbf43fab7d5 720 break;
wvd_vegt 3:abbf43fab7d5 721
wvd_vegt 7:269c2445b8f5 722 #endif //ENABLEMACROS
wvd_vegt 3:abbf43fab7d5 723
wvd_vegt 3:abbf43fab7d5 724 #ifdef STATEMACHINE
wvd_vegt 7:269c2445b8f5 725 /////// GLOBAL STATEMACHINE COMMANDS ///////
wvd_vegt 3:abbf43fab7d5 726
wvd_vegt 3:abbf43fab7d5 727 //Start State Machine
wvd_vegt 3:abbf43fab7d5 728 case CID_STATE:
wvd_vegt 3:abbf43fab7d5 729 statemachine(BYTEPARM(0));
wvd_vegt 3:abbf43fab7d5 730
wvd_vegt 3:abbf43fab7d5 731 break;
wvd_vegt 3:abbf43fab7d5 732 #endif
wvd_vegt 3:abbf43fab7d5 733
wvd_vegt 3:abbf43fab7d5 734 /////// GLOBAL COMMANDS ///////
wvd_vegt 9:dc9faec79298 735 case CID_COMMANDS:
wvd_vegt 9:dc9faec79298 736 cmd_dump();
wvd_vegt 9:dc9faec79298 737 break;
wvd_vegt 3:abbf43fab7d5 738
wvd_vegt 3:abbf43fab7d5 739 //Echo
wvd_vegt 3:abbf43fab7d5 740 case CID_ECHO:
wvd_vegt 3:abbf43fab7d5 741 echo = BOOLPARM(0);
wvd_vegt 3:abbf43fab7d5 742 break;
wvd_vegt 3:abbf43fab7d5 743
wvd_vegt 3:abbf43fab7d5 744 //Bold
wvd_vegt 3:abbf43fab7d5 745 case CID_BOLD:
wvd_vegt 3:abbf43fab7d5 746 bold = BOOLPARM(0);
wvd_vegt 3:abbf43fab7d5 747 break;
wvd_vegt 3:abbf43fab7d5 748
wvd_vegt 3:abbf43fab7d5 749 //Warm Boot
wvd_vegt 3:abbf43fab7d5 750 case CID_BOOT:
wvd_vegt 7:269c2445b8f5 751 mbed_reset();
wvd_vegt 3:abbf43fab7d5 752 break;
wvd_vegt 3:abbf43fab7d5 753
wvd_vegt 3:abbf43fab7d5 754 //Sends an ANSI escape code to clear the screen.
wvd_vegt 3:abbf43fab7d5 755 case CID_CLS:
wvd_vegt 7:269c2445b8f5 756 print(cls);
wvd_vegt 3:abbf43fab7d5 757 break;
wvd_vegt 3:abbf43fab7d5 758
wvd_vegt 3:abbf43fab7d5 759 //Returns to CMD> prompt where most commands are disabled.
wvd_vegt 3:abbf43fab7d5 760 case CID_IDLE:
wvd_vegt 3:abbf43fab7d5 761 subsystem=-1;
wvd_vegt 3:abbf43fab7d5 762 break;
wvd_vegt 3:abbf43fab7d5 763
wvd_vegt 3:abbf43fab7d5 764 //Help
wvd_vegt 3:abbf43fab7d5 765 case CID_HELP: {
wvd_vegt 7:269c2445b8f5 766 print("\r\n");
wvd_vegt 3:abbf43fab7d5 767
wvd_vegt 3:abbf43fab7d5 768 if (argfnd>0) {
wvd_vegt 7:269c2445b8f5 769 cid = cmdid_search(STRINGPARM(0));
wvd_vegt 3:abbf43fab7d5 770 } else {
wvd_vegt 3:abbf43fab7d5 771 cid=CID_LAST;
wvd_vegt 3:abbf43fab7d5 772 }
wvd_vegt 3:abbf43fab7d5 773
wvd_vegt 3:abbf43fab7d5 774 if (argfnd>0 && cid!=CID_LAST) {
wvd_vegt 3:abbf43fab7d5 775
wvd_vegt 3:abbf43fab7d5 776 //Help with a valid command as first parameter
wvd_vegt 7:269c2445b8f5 777 ndx = cmdid_index(cid);
wvd_vegt 7:269c2445b8f5 778
wvd_vegt 7:269c2445b8f5 779 switch (cmds[ndx].subs) {
wvd_vegt 7:269c2445b8f5 780 case SUBSYSTEM: { //Dump whole subsystem
wvd_vegt 7:269c2445b8f5 781 printf("%s subsystem commands:\r\n\r\n",cmds[ndx].cmdstr);
wvd_vegt 3:abbf43fab7d5 782
wvd_vegt 7:269c2445b8f5 783 //Count SubSystem Commands.
wvd_vegt 7:269c2445b8f5 784 int subcmds =0;
wvd_vegt 17:7e6a723d65de 785 for (int i=0; i<cmds.size(); i++) {
wvd_vegt 7:269c2445b8f5 786 if (cmds[i].subs==cid) {
wvd_vegt 7:269c2445b8f5 787 subcmds++;
wvd_vegt 3:abbf43fab7d5 788 }
wvd_vegt 3:abbf43fab7d5 789 }
wvd_vegt 3:abbf43fab7d5 790
wvd_vegt 7:269c2445b8f5 791 //Print SubSystem Commands.
wvd_vegt 17:7e6a723d65de 792 for (int i=0; i<cmds.size()-1; i++) {
wvd_vegt 7:269c2445b8f5 793 if (cmds[i].subs==cid) {
wvd_vegt 7:269c2445b8f5 794 subcmds--;
wvd_vegt 7:269c2445b8f5 795 if (subcmds!=0) {
wvd_vegt 9:dc9faec79298 796 cmd_help("",i,",\r\n");
wvd_vegt 7:269c2445b8f5 797 } else {
wvd_vegt 9:dc9faec79298 798 cmd_help("",i,".\r\n");
wvd_vegt 7:269c2445b8f5 799 }
wvd_vegt 7:269c2445b8f5 800 }
wvd_vegt 7:269c2445b8f5 801 }
wvd_vegt 7:269c2445b8f5 802 }
wvd_vegt 7:269c2445b8f5 803 break;
wvd_vegt 3:abbf43fab7d5 804
wvd_vegt 3:abbf43fab7d5 805 case GLOBALCMD: //Dump command only
wvd_vegt 7:269c2445b8f5 806 //print("Global command:\r\n\r\n",cmd_tbl[cmd_tbl[ndx].subs].cmdstr);
wvd_vegt 9:dc9faec79298 807 cmd_help("Syntax: ",ndx,".\r\n");
wvd_vegt 16:ec8147828286 808
wvd_vegt 3:abbf43fab7d5 809 break;
wvd_vegt 3:abbf43fab7d5 810
wvd_vegt 16:ec8147828286 811 default: { //Dump one subsystem command
wvd_vegt 16:ec8147828286 812 int sndx = cmdid_index(cmds[ndx].subs);
wvd_vegt 16:ec8147828286 813
wvd_vegt 16:ec8147828286 814 printf("%s subsystem command:\r\n\r\n",cmds[sndx].cmdstr);
wvd_vegt 16:ec8147828286 815
wvd_vegt 9:dc9faec79298 816 cmd_help("Syntax: ",ndx,".\r\n");
wvd_vegt 16:ec8147828286 817 }
wvd_vegt 16:ec8147828286 818 break;
wvd_vegt 3:abbf43fab7d5 819 }
wvd_vegt 3:abbf43fab7d5 820 } else {
wvd_vegt 3:abbf43fab7d5 821 if (argfnd>0) {
wvd_vegt 3:abbf43fab7d5 822 //Help with invalid command as first parameter
wvd_vegt 7:269c2445b8f5 823 print("Unknown command, type 'Help' for a list of available commands.\r\n");
wvd_vegt 3:abbf43fab7d5 824 } else {
wvd_vegt 3:abbf43fab7d5 825 //Help
wvd_vegt 3:abbf43fab7d5 826
wvd_vegt 3:abbf43fab7d5 827 //Dump Active Subsystem, Global & Other (dormant) Subsystems
wvd_vegt 7:269c2445b8f5 828 //-1 because we want comma's and for the last a .
wvd_vegt 17:7e6a723d65de 829 for (int i=0; i<cmds.size()-1; i++) {
wvd_vegt 7:269c2445b8f5 830 if ((cmds[i].subs<0) || (cmds[i].subs==subsystem)) {
wvd_vegt 9:dc9faec79298 831 cmd_help("",i,",\r\n");
wvd_vegt 3:abbf43fab7d5 832 }
wvd_vegt 3:abbf43fab7d5 833 }
wvd_vegt 9:dc9faec79298 834 cmd_help("",cmds.size()-1,".\r\n");
wvd_vegt 3:abbf43fab7d5 835 }
wvd_vegt 3:abbf43fab7d5 836 }
wvd_vegt 7:269c2445b8f5 837 print("\r\n");
wvd_vegt 3:abbf43fab7d5 838 break;
wvd_vegt 3:abbf43fab7d5 839 } //CID_HELP
wvd_vegt 7:269c2445b8f5 840
wvd_vegt 6:76b033971c3c 841 default : {
wvd_vegt 7:269c2445b8f5 842 // Do a Call to the Application's Command Dispatcher.
wvd_vegt 13:c18957fb06e4 843 (*user_callback)(*this, cid);
wvd_vegt 6:76b033971c3c 844 }
wvd_vegt 3:abbf43fab7d5 845 }
wvd_vegt 3:abbf43fab7d5 846 } else {
wvd_vegt 9:dc9faec79298 847 cmd_help("Syntax: ",ndx,".\r\n");
wvd_vegt 3:abbf43fab7d5 848 }
wvd_vegt 6:76b033971c3c 849
wvd_vegt 7:269c2445b8f5 850 }
wvd_vegt 3:abbf43fab7d5 851
wvd_vegt 3:abbf43fab7d5 852 } else {
wvd_vegt 7:269c2445b8f5 853 //cid==-1
wvd_vegt 3:abbf43fab7d5 854 }
wvd_vegt 3:abbf43fab7d5 855 }
wvd_vegt 3:abbf43fab7d5 856
wvd_vegt 9:dc9faec79298 857 //------------------------------------------------------------------------------
wvd_vegt 9:dc9faec79298 858 //----Dump commands table as a ini file.
wvd_vegt 9:dc9faec79298 859 //------------------------------------------------------------------------------
wvd_vegt 9:dc9faec79298 860
wvd_vegt 9:dc9faec79298 861 void Cmdb::cmd_dump() {
wvd_vegt 9:dc9faec79298 862 int ndx;
wvd_vegt 9:dc9faec79298 863 int j;
wvd_vegt 9:dc9faec79298 864 int k;
wvd_vegt 9:dc9faec79298 865 int lastmod;
wvd_vegt 9:dc9faec79298 866
wvd_vegt 9:dc9faec79298 867 k = 0;
wvd_vegt 9:dc9faec79298 868 lastmod = 0;
wvd_vegt 9:dc9faec79298 869
wvd_vegt 17:7e6a723d65de 870 for (ndx=0; ndx<cmds.size(); ndx++) {
wvd_vegt 9:dc9faec79298 871
wvd_vegt 9:dc9faec79298 872 #ifndef SHOWHIDDEN
wvd_vegt 9:dc9faec79298 873 if (cmds[ndx].subs==HIDDENSUB) {
wvd_vegt 9:dc9faec79298 874 continue;
wvd_vegt 9:dc9faec79298 875 }
wvd_vegt 9:dc9faec79298 876 #endif
wvd_vegt 9:dc9faec79298 877
wvd_vegt 9:dc9faec79298 878 switch (cmds[ndx].subs) {
wvd_vegt 9:dc9faec79298 879 case SUBSYSTEM :
wvd_vegt 9:dc9faec79298 880 printf("[command%2.2d]\r\n",ndx+1);
wvd_vegt 9:dc9faec79298 881 print("type=Subsystem\r\n");
wvd_vegt 9:dc9faec79298 882 print("subsystem=Global\r\n");
wvd_vegt 9:dc9faec79298 883 break;
wvd_vegt 9:dc9faec79298 884 case HIDDENSUB :
wvd_vegt 9:dc9faec79298 885 #ifdef SHOWHIDDEN
wvd_vegt 9:dc9faec79298 886 printf("[command%2.2d]\r\n",ndx+1);
wvd_vegt 9:dc9faec79298 887 print("type=HiddenSubystem\r\n");
wvd_vegt 9:dc9faec79298 888 print("subsystem=Global\r\n");
wvd_vegt 9:dc9faec79298 889 #endif
wvd_vegt 9:dc9faec79298 890 break;
wvd_vegt 9:dc9faec79298 891 case GLOBALCMD :
wvd_vegt 9:dc9faec79298 892 printf("[command%2.2d]\r\n",ndx+1);
wvd_vegt 9:dc9faec79298 893 print("type=GlobalCommand\r\n");
wvd_vegt 9:dc9faec79298 894 print("subsystem=Global\r\n");
wvd_vegt 9:dc9faec79298 895 break;
wvd_vegt 9:dc9faec79298 896 default :
wvd_vegt 16:ec8147828286 897 int sndx = cmdid_index(cmds[ndx].subs);
wvd_vegt 16:ec8147828286 898
wvd_vegt 16:ec8147828286 899 if (cmds[sndx].subs==HIDDENSUB) {
wvd_vegt 9:dc9faec79298 900 #ifdef SHOWHIDDEN
wvd_vegt 9:dc9faec79298 901 printf("[command%2.2d]\r\n",ndx+1);
wvd_vegt 9:dc9faec79298 902 print("type=HiddenCommand\r\n");
wvd_vegt 9:dc9faec79298 903 print("subsystem=HiddenSubystem\r\n");
wvd_vegt 9:dc9faec79298 904 #endif
wvd_vegt 9:dc9faec79298 905 continue;
wvd_vegt 9:dc9faec79298 906 }
wvd_vegt 16:ec8147828286 907
wvd_vegt 9:dc9faec79298 908 printf("[command%2.2d]\r\n",ndx+1);
wvd_vegt 9:dc9faec79298 909 print("type=Command\r\n");
wvd_vegt 16:ec8147828286 910 printf("subsystem=%s\r\n",cmds[sndx].cmdstr);
wvd_vegt 9:dc9faec79298 911 }
wvd_vegt 9:dc9faec79298 912
wvd_vegt 9:dc9faec79298 913 if (cmds[ndx].subs==HIDDENSUB) {
wvd_vegt 9:dc9faec79298 914 continue;
wvd_vegt 9:dc9faec79298 915 }
wvd_vegt 9:dc9faec79298 916
wvd_vegt 9:dc9faec79298 917 printf("command=%s\r\n",cmds[ndx].cmdstr);
wvd_vegt 9:dc9faec79298 918 printf("helpmsg=%s\r\n",cmds[ndx].cmddescr);
wvd_vegt 9:dc9faec79298 919 print("parameters=");
wvd_vegt 17:7e6a723d65de 920 for (j=0; j<strlen(cmds[ndx].parms); j++) {
wvd_vegt 9:dc9faec79298 921 switch (cmds[ndx].parms[j]) {
wvd_vegt 9:dc9faec79298 922 case '%' :
wvd_vegt 9:dc9faec79298 923 lastmod=0;
wvd_vegt 9:dc9faec79298 924 break;
wvd_vegt 9:dc9faec79298 925
wvd_vegt 9:dc9faec79298 926 case 'b' :
wvd_vegt 9:dc9faec79298 927 lastmod=8;
wvd_vegt 9:dc9faec79298 928 break;
wvd_vegt 9:dc9faec79298 929 case 'h' :
wvd_vegt 9:dc9faec79298 930 lastmod=16;
wvd_vegt 9:dc9faec79298 931 break;
wvd_vegt 9:dc9faec79298 932 case 'l' :
wvd_vegt 9:dc9faec79298 933 lastmod=32;
wvd_vegt 9:dc9faec79298 934 break;
wvd_vegt 9:dc9faec79298 935
wvd_vegt 9:dc9faec79298 936 case 'd' :
wvd_vegt 9:dc9faec79298 937 case 'i' : {
wvd_vegt 9:dc9faec79298 938 switch (lastmod) {
wvd_vegt 9:dc9faec79298 939 case 0 :
wvd_vegt 9:dc9faec79298 940 case 16 :
wvd_vegt 9:dc9faec79298 941 print("int");
wvd_vegt 9:dc9faec79298 942 k+=3;
wvd_vegt 9:dc9faec79298 943 break;
wvd_vegt 9:dc9faec79298 944 case 8 :
wvd_vegt 9:dc9faec79298 945 print("shortint");
wvd_vegt 9:dc9faec79298 946 k+=8;
wvd_vegt 9:dc9faec79298 947 break;
wvd_vegt 9:dc9faec79298 948 case 32:
wvd_vegt 9:dc9faec79298 949 print("longint");
wvd_vegt 9:dc9faec79298 950 k+=7;
wvd_vegt 9:dc9faec79298 951 break;
wvd_vegt 9:dc9faec79298 952 }
wvd_vegt 9:dc9faec79298 953 break;
wvd_vegt 9:dc9faec79298 954 }
wvd_vegt 9:dc9faec79298 955
wvd_vegt 9:dc9faec79298 956 case 'u' :
wvd_vegt 9:dc9faec79298 957 case 'o' :
wvd_vegt 9:dc9faec79298 958 case 'x' : {
wvd_vegt 9:dc9faec79298 959 switch (lastmod) {
wvd_vegt 9:dc9faec79298 960 case 0 :
wvd_vegt 9:dc9faec79298 961 case 16 :
wvd_vegt 9:dc9faec79298 962 print("word");
wvd_vegt 9:dc9faec79298 963 k+=4;
wvd_vegt 9:dc9faec79298 964 break;
wvd_vegt 9:dc9faec79298 965 case 8 :
wvd_vegt 9:dc9faec79298 966 print("byte");
wvd_vegt 9:dc9faec79298 967 k+=4;
wvd_vegt 9:dc9faec79298 968 break;
wvd_vegt 9:dc9faec79298 969 case 32 :
wvd_vegt 9:dc9faec79298 970 print("dword");
wvd_vegt 9:dc9faec79298 971 k+=5;
wvd_vegt 9:dc9faec79298 972 break;
wvd_vegt 9:dc9faec79298 973 }
wvd_vegt 9:dc9faec79298 974
wvd_vegt 9:dc9faec79298 975 switch (cmds[ndx].parms[j]) {
wvd_vegt 9:dc9faec79298 976 case 'o' :
wvd_vegt 9:dc9faec79298 977 print("[o]");
wvd_vegt 9:dc9faec79298 978 k+=3;
wvd_vegt 9:dc9faec79298 979 break;
wvd_vegt 9:dc9faec79298 980 case 'x' :
wvd_vegt 9:dc9faec79298 981 print("[h]");
wvd_vegt 9:dc9faec79298 982 k+=3;
wvd_vegt 9:dc9faec79298 983 break;
wvd_vegt 9:dc9faec79298 984 }
wvd_vegt 9:dc9faec79298 985
wvd_vegt 9:dc9faec79298 986 break;
wvd_vegt 9:dc9faec79298 987 }
wvd_vegt 9:dc9faec79298 988
wvd_vegt 9:dc9faec79298 989 case 'e' :
wvd_vegt 9:dc9faec79298 990 case 'f' :
wvd_vegt 9:dc9faec79298 991 case 'g' :
wvd_vegt 9:dc9faec79298 992 print("float");
wvd_vegt 9:dc9faec79298 993 k+=5;
wvd_vegt 9:dc9faec79298 994 break;
wvd_vegt 9:dc9faec79298 995
wvd_vegt 9:dc9faec79298 996 case 'c' :
wvd_vegt 9:dc9faec79298 997 print("char");
wvd_vegt 9:dc9faec79298 998 k+=4;
wvd_vegt 9:dc9faec79298 999 break;
wvd_vegt 9:dc9faec79298 1000
wvd_vegt 9:dc9faec79298 1001 case 's' :
wvd_vegt 9:dc9faec79298 1002 print("string");
wvd_vegt 9:dc9faec79298 1003 k+=6;
wvd_vegt 9:dc9faec79298 1004 break;
wvd_vegt 9:dc9faec79298 1005
wvd_vegt 9:dc9faec79298 1006 case ' ' :
wvd_vegt 9:dc9faec79298 1007 printch(sp);
wvd_vegt 9:dc9faec79298 1008 k++;
wvd_vegt 9:dc9faec79298 1009 break;
wvd_vegt 9:dc9faec79298 1010 }
wvd_vegt 9:dc9faec79298 1011 }
wvd_vegt 9:dc9faec79298 1012 print("\r\n");
wvd_vegt 9:dc9faec79298 1013 printf("syntax=%s\r\n",cmds[ndx].parmdescr);
wvd_vegt 9:dc9faec79298 1014 }
wvd_vegt 9:dc9faec79298 1015 }
wvd_vegt 9:dc9faec79298 1016
wvd_vegt 7:269c2445b8f5 1017 void Cmdb::prompt(void) {
wvd_vegt 7:269c2445b8f5 1018 #ifdef SUBSYSTEMPROMPTS
wvd_vegt 7:269c2445b8f5 1019 if (subsystem!=-1) {
wvd_vegt 7:269c2445b8f5 1020 int ndx = cmdid_index(subsystem);
wvd_vegt 3:abbf43fab7d5 1021
wvd_vegt 9:dc9faec79298 1022 printf("%s>",cmds[ndx].cmdstr);
wvd_vegt 7:269c2445b8f5 1023
wvd_vegt 7:269c2445b8f5 1024 return;
wvd_vegt 3:abbf43fab7d5 1025 }
wvd_vegt 7:269c2445b8f5 1026 #endif //SUBSYSTEMPROMPTS
wvd_vegt 3:abbf43fab7d5 1027
wvd_vegt 7:269c2445b8f5 1028 printf(PROMPT);
wvd_vegt 3:abbf43fab7d5 1029 }
wvd_vegt 3:abbf43fab7d5 1030
wvd_vegt 9:dc9faec79298 1031 void Cmdb::cmd_help(char *pre, int ndx, char *post) {
wvd_vegt 3:abbf43fab7d5 1032 int j;
wvd_vegt 3:abbf43fab7d5 1033 int k;
wvd_vegt 3:abbf43fab7d5 1034 int lastmod;
wvd_vegt 3:abbf43fab7d5 1035
wvd_vegt 3:abbf43fab7d5 1036 k=0;
wvd_vegt 3:abbf43fab7d5 1037 lastmod=0;
wvd_vegt 3:abbf43fab7d5 1038
wvd_vegt 7:269c2445b8f5 1039 switch (cmds[ndx].subs) {
wvd_vegt 3:abbf43fab7d5 1040 case SUBSYSTEM :
wvd_vegt 3:abbf43fab7d5 1041 break;
wvd_vegt 3:abbf43fab7d5 1042 case GLOBALCMD :
wvd_vegt 3:abbf43fab7d5 1043 break;
wvd_vegt 3:abbf43fab7d5 1044 case HIDDENSUB :
wvd_vegt 3:abbf43fab7d5 1045 return;
wvd_vegt 3:abbf43fab7d5 1046 default :
wvd_vegt 3:abbf43fab7d5 1047 if (strlen(pre)==0 && bold) {
wvd_vegt 7:269c2445b8f5 1048 print(boldon);
wvd_vegt 3:abbf43fab7d5 1049 }
wvd_vegt 3:abbf43fab7d5 1050 break;
wvd_vegt 3:abbf43fab7d5 1051 }
wvd_vegt 3:abbf43fab7d5 1052
wvd_vegt 7:269c2445b8f5 1053 print(pre);
wvd_vegt 3:abbf43fab7d5 1054 k+=strlen(pre);
wvd_vegt 3:abbf43fab7d5 1055
wvd_vegt 3:abbf43fab7d5 1056 if (k==0) {
wvd_vegt 7:269c2445b8f5 1057 printf("%12s",cmds[ndx].cmdstr);
wvd_vegt 3:abbf43fab7d5 1058 k+=12;
wvd_vegt 3:abbf43fab7d5 1059 } else {
wvd_vegt 3:abbf43fab7d5 1060 if (strlen(pre)>0 && bold) {
wvd_vegt 7:269c2445b8f5 1061 print(boldon);
wvd_vegt 3:abbf43fab7d5 1062 }
wvd_vegt 3:abbf43fab7d5 1063
wvd_vegt 7:269c2445b8f5 1064 printf("%s",cmds[ndx].cmdstr);
wvd_vegt 7:269c2445b8f5 1065 k+=strlen(cmds[ndx].cmdstr);
wvd_vegt 3:abbf43fab7d5 1066
wvd_vegt 3:abbf43fab7d5 1067 if (strlen(pre)>0 && bold) {
wvd_vegt 7:269c2445b8f5 1068 print(boldoff);
wvd_vegt 3:abbf43fab7d5 1069 }
wvd_vegt 3:abbf43fab7d5 1070 }
wvd_vegt 3:abbf43fab7d5 1071
wvd_vegt 7:269c2445b8f5 1072 if (strlen(cmds[ndx].parms)) {
wvd_vegt 7:269c2445b8f5 1073 printch(sp);
wvd_vegt 3:abbf43fab7d5 1074 k++;
wvd_vegt 3:abbf43fab7d5 1075 }
wvd_vegt 3:abbf43fab7d5 1076
wvd_vegt 17:7e6a723d65de 1077 for (j=0; j<strlen(cmds[ndx].parms); j++) {
wvd_vegt 7:269c2445b8f5 1078 switch (cmds[ndx].parms[j]) {
wvd_vegt 3:abbf43fab7d5 1079 case '%' :
wvd_vegt 3:abbf43fab7d5 1080 lastmod=0;
wvd_vegt 3:abbf43fab7d5 1081 break;
wvd_vegt 3:abbf43fab7d5 1082
wvd_vegt 3:abbf43fab7d5 1083 case 'b' :
wvd_vegt 3:abbf43fab7d5 1084 lastmod=8;
wvd_vegt 3:abbf43fab7d5 1085 break;
wvd_vegt 3:abbf43fab7d5 1086 case 'h' :
wvd_vegt 3:abbf43fab7d5 1087 lastmod=16;
wvd_vegt 3:abbf43fab7d5 1088 break;
wvd_vegt 3:abbf43fab7d5 1089 case 'l' :
wvd_vegt 3:abbf43fab7d5 1090 lastmod=32;
wvd_vegt 3:abbf43fab7d5 1091 break;
wvd_vegt 3:abbf43fab7d5 1092
wvd_vegt 3:abbf43fab7d5 1093 case 'd' :
wvd_vegt 3:abbf43fab7d5 1094 case 'i' : {
wvd_vegt 3:abbf43fab7d5 1095 switch (lastmod) {
wvd_vegt 3:abbf43fab7d5 1096 case 0 :
wvd_vegt 3:abbf43fab7d5 1097 case 16 :
wvd_vegt 7:269c2445b8f5 1098 print("int");
wvd_vegt 3:abbf43fab7d5 1099 k+=3;
wvd_vegt 3:abbf43fab7d5 1100 break;
wvd_vegt 3:abbf43fab7d5 1101 case 8 :
wvd_vegt 7:269c2445b8f5 1102 print("shortint");
wvd_vegt 3:abbf43fab7d5 1103 k+=8;
wvd_vegt 3:abbf43fab7d5 1104 break;
wvd_vegt 3:abbf43fab7d5 1105 case 32:
wvd_vegt 7:269c2445b8f5 1106 print("longint");
wvd_vegt 3:abbf43fab7d5 1107 k+=7;
wvd_vegt 3:abbf43fab7d5 1108 break;
wvd_vegt 3:abbf43fab7d5 1109 }
wvd_vegt 3:abbf43fab7d5 1110 break;
wvd_vegt 3:abbf43fab7d5 1111 }
wvd_vegt 3:abbf43fab7d5 1112
wvd_vegt 3:abbf43fab7d5 1113 case 'u' :
wvd_vegt 3:abbf43fab7d5 1114 case 'o' :
wvd_vegt 3:abbf43fab7d5 1115 case 'x' : {
wvd_vegt 3:abbf43fab7d5 1116 switch (lastmod) {
wvd_vegt 3:abbf43fab7d5 1117 case 0 :
wvd_vegt 3:abbf43fab7d5 1118 case 16 :
wvd_vegt 7:269c2445b8f5 1119 print("word");
wvd_vegt 3:abbf43fab7d5 1120 k+=4;
wvd_vegt 3:abbf43fab7d5 1121 break;
wvd_vegt 3:abbf43fab7d5 1122 case 8 :
wvd_vegt 7:269c2445b8f5 1123 print("byte");
wvd_vegt 3:abbf43fab7d5 1124 k+=4;
wvd_vegt 3:abbf43fab7d5 1125 break;
wvd_vegt 3:abbf43fab7d5 1126 case 32 :
wvd_vegt 7:269c2445b8f5 1127 print("dword");
wvd_vegt 3:abbf43fab7d5 1128 k+=5;
wvd_vegt 3:abbf43fab7d5 1129 break;
wvd_vegt 3:abbf43fab7d5 1130 }
wvd_vegt 3:abbf43fab7d5 1131
wvd_vegt 7:269c2445b8f5 1132 switch (cmds[ndx].parms[j]) {
wvd_vegt 3:abbf43fab7d5 1133 case 'o' :
wvd_vegt 7:269c2445b8f5 1134 print("[o]");
wvd_vegt 3:abbf43fab7d5 1135 k+=3;
wvd_vegt 3:abbf43fab7d5 1136 break;
wvd_vegt 3:abbf43fab7d5 1137 case 'x' :
wvd_vegt 7:269c2445b8f5 1138 print("[h]");
wvd_vegt 3:abbf43fab7d5 1139 k+=3;
wvd_vegt 3:abbf43fab7d5 1140 break;
wvd_vegt 3:abbf43fab7d5 1141 }
wvd_vegt 3:abbf43fab7d5 1142
wvd_vegt 3:abbf43fab7d5 1143 break;
wvd_vegt 3:abbf43fab7d5 1144 }
wvd_vegt 3:abbf43fab7d5 1145
wvd_vegt 3:abbf43fab7d5 1146 case 'e' :
wvd_vegt 3:abbf43fab7d5 1147 case 'f' :
wvd_vegt 3:abbf43fab7d5 1148 case 'g' :
wvd_vegt 7:269c2445b8f5 1149 print("float");
wvd_vegt 3:abbf43fab7d5 1150 k+=5;
wvd_vegt 3:abbf43fab7d5 1151 break;
wvd_vegt 3:abbf43fab7d5 1152
wvd_vegt 3:abbf43fab7d5 1153 case 'c' :
wvd_vegt 7:269c2445b8f5 1154 print("char");
wvd_vegt 3:abbf43fab7d5 1155 k+=4;
wvd_vegt 3:abbf43fab7d5 1156 break;
wvd_vegt 3:abbf43fab7d5 1157
wvd_vegt 3:abbf43fab7d5 1158 case 's' :
wvd_vegt 7:269c2445b8f5 1159 print("string");
wvd_vegt 3:abbf43fab7d5 1160 k+=6;
wvd_vegt 3:abbf43fab7d5 1161 break;
wvd_vegt 3:abbf43fab7d5 1162
wvd_vegt 3:abbf43fab7d5 1163 case ' ' :
wvd_vegt 7:269c2445b8f5 1164 printch(sp);
wvd_vegt 3:abbf43fab7d5 1165 k++;
wvd_vegt 3:abbf43fab7d5 1166 break;
wvd_vegt 3:abbf43fab7d5 1167 }
wvd_vegt 3:abbf43fab7d5 1168 }
wvd_vegt 3:abbf43fab7d5 1169
wvd_vegt 17:7e6a723d65de 1170 for (j=k; j<40; j++) printch(sp);
wvd_vegt 3:abbf43fab7d5 1171
wvd_vegt 7:269c2445b8f5 1172 switch (cmds[ndx].subs) {
wvd_vegt 3:abbf43fab7d5 1173 case SUBSYSTEM :
wvd_vegt 3:abbf43fab7d5 1174 if (ndx==subsystem) {
wvd_vegt 7:269c2445b8f5 1175 printf("- %s (active subsystem)%s",cmds[ndx].cmddescr,post);
wvd_vegt 3:abbf43fab7d5 1176 } else {
wvd_vegt 7:269c2445b8f5 1177 printf("- %s (dormant subsystem)%s",cmds[ndx].cmddescr,post);
wvd_vegt 3:abbf43fab7d5 1178 }
wvd_vegt 3:abbf43fab7d5 1179 break;
wvd_vegt 3:abbf43fab7d5 1180 case HIDDENSUB :
wvd_vegt 3:abbf43fab7d5 1181 break;
wvd_vegt 3:abbf43fab7d5 1182 case GLOBALCMD :
wvd_vegt 7:269c2445b8f5 1183 printf("- %s (global command)%s",cmds[ndx].cmddescr,post);
wvd_vegt 3:abbf43fab7d5 1184 break;
wvd_vegt 3:abbf43fab7d5 1185 default :
wvd_vegt 7:269c2445b8f5 1186 printf("- %s%s",cmds[ndx].cmddescr,post);
wvd_vegt 3:abbf43fab7d5 1187 if (strlen(pre)==0 && bold) {
wvd_vegt 7:269c2445b8f5 1188 print(boldoff);
wvd_vegt 3:abbf43fab7d5 1189 }
wvd_vegt 3:abbf43fab7d5 1190 break;
wvd_vegt 3:abbf43fab7d5 1191 }
wvd_vegt 3:abbf43fab7d5 1192
wvd_vegt 7:269c2445b8f5 1193 if (strlen(pre)>0 && strlen(cmds[ndx].parmdescr)) {
wvd_vegt 7:269c2445b8f5 1194 printf("Params: %s",cmds[ndx].parmdescr);
wvd_vegt 7:269c2445b8f5 1195 print("\r\n");
wvd_vegt 3:abbf43fab7d5 1196 }
wvd_vegt 3:abbf43fab7d5 1197 }
wvd_vegt 3:abbf43fab7d5 1198
wvd_vegt 3:abbf43fab7d5 1199 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 1200 //----Wrappers
wvd_vegt 3:abbf43fab7d5 1201 //------------------------------------------------------------------------------
wvd_vegt 3:abbf43fab7d5 1202
wvd_vegt 3:abbf43fab7d5 1203 void Cmdb::zeromemory(char *p,unsigned int siz) {
wvd_vegt 3:abbf43fab7d5 1204 memset(p,'\0',siz);
wvd_vegt 3:abbf43fab7d5 1205 }
wvd_vegt 3:abbf43fab7d5 1206
wvd_vegt 3:abbf43fab7d5 1207 int Cmdb::stricmp (char *s1, char *s2) {
wvd_vegt 3:abbf43fab7d5 1208 int i;
wvd_vegt 3:abbf43fab7d5 1209 int len1,len2;
wvd_vegt 3:abbf43fab7d5 1210
wvd_vegt 3:abbf43fab7d5 1211 len1=strlen(s1);
wvd_vegt 3:abbf43fab7d5 1212 len2=strlen(s2);
wvd_vegt 3:abbf43fab7d5 1213
wvd_vegt 17:7e6a723d65de 1214 for (i = 0; (i<len1) && (i<len2); i++) {
wvd_vegt 3:abbf43fab7d5 1215 if ( toupper (s1[i])<toupper(s2[i]) ) return (-1);
wvd_vegt 3:abbf43fab7d5 1216 if ( toupper (s1[i])>toupper(s2[i]) ) return (+1);
wvd_vegt 3:abbf43fab7d5 1217 }
wvd_vegt 3:abbf43fab7d5 1218
wvd_vegt 3:abbf43fab7d5 1219 if (len1<len2) return (-1);
wvd_vegt 3:abbf43fab7d5 1220 if (len1>len2) return (+1);
wvd_vegt 3:abbf43fab7d5 1221
wvd_vegt 3:abbf43fab7d5 1222 return (0);
wvd_vegt 3:abbf43fab7d5 1223 }
wvd_vegt 7:269c2445b8f5 1224
wvd_vegt 7:269c2445b8f5 1225 //------------------------------------------------------------------------------