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

Committer:
wvd_vegt
Date:
Tue Nov 22 12:57:13 2011 +0000
Revision:
22:5192a468d7fa
Parent:
21:d22068e2bbd1
Child:
23:73a4f087c1b9
Corrected printnerror\s return value
Added printmsg()

Who changed what in which revision?

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