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

Committer:
wvd_vegt
Date:
Mon Sep 05 10:05:49 2011 +0000
Revision:
17:7e6a723d65de
Parent:
16:ec8147828286
Child:
18:7a4dc478d022
Added present(). replace() and indexof() methods.

Who changed what in which revision?

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