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

Dependents:   mbed_controller_demo

Fork of CMDB by Wim van der Vegt

Committer:
wvd_vegt
Date:
Fri Feb 11 12:44:54 2011 +0000
Revision:
13:c18957fb06e4
Parent:
9:dc9faec79298
Child:
14:c652ce068f6c
0.75

Who changed what in which revision?

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