A Command Interpreter with support for used defined commands, subsystems, macros, help and parameter parsing.
Diff: cmdb.cpp
- Revision:
- 23:73a4f087c1b9
- Parent:
- 22:5192a468d7fa
diff -r 5192a468d7fa -r 73a4f087c1b9 cmdb.cpp --- a/cmdb.cpp Tue Nov 22 12:57:13 2011 +0000 +++ b/cmdb.cpp Wed Feb 15 09:42:30 2012 +0000 @@ -271,6 +271,10 @@ return serial.printf(msg); } +int Cmdb::println(const char *msg) { + return serial.printf("%s\r\n", msg); +} + int Cmdb::printsection(const char *section) { return printf("[%s]\r\n", section); } @@ -281,7 +285,22 @@ int Cmdb::printerror(const char *errormsg) { int a = printsection("Error"); - return a==0?a:a+printmsg("%s\r\n", errormsg); + return a==0?a:a+printmsg(errormsg); +} + +int Cmdb::printerrorf(const char *format, ...) { + char buf[256]; + + int a = printsection("Error"); + + va_list args; + va_start(args, format); + + vsnprintf(buf, sizeof(buf), format, args); + + va_end(args); + + return a + printf("Msg=%s\r\n", buf); } int Cmdb::printvaluef(const char *key, const char *format, ...) { @@ -298,31 +317,30 @@ } int Cmdb::printvaluef(const char *key, const int width, const char *comment, const char *format, ...) { - printf("%s=",key); - - int result = 0; char buf[256]; - int cnt = 0; + + int cnt = printf("%s=",key); va_list args; va_start(args, format); - cnt = vsnprintf(buf, sizeof(buf), format, args); - cnt +=strlen(key) + 1; - + vsnprintf(buf, sizeof(buf), format, args); + va_end(args); if (comment!=NULL) { + cnt += printf("%s", buf); + if (cnt<width) { - result = printf("%-*s ;%s\r\n", width - cnt + 3, buf, comment); + cnt += printf("%-*s ; %s\r\n", width - cnt - 1, "", comment); } else { - result = printf("%s ;%s\r\n", buf, comment); + cnt += printf("%s ; %s\r\n", "", comment); } } else { - result = printf("%s\r\n",buf); + cnt += printf("%s\r\n",buf); } - return result; + return cnt; } int Cmdb::printvalue(const char *key, const char *value, const char *comment, const int width) { @@ -334,20 +352,27 @@ cnt = snprintf(buf, sizeof(buf), "%s=%s", key, value); - if (cnt<width) { - return printf("%-*s ;%s\r\n", width, buf, comment); + if (cnt<=width) { + return printf("%-*s ; %s\r\n", width - cnt + 1, buf, comment); } else { - return printf("%s ;%s\r\n", buf, comment); + return printf("%s ; %s\r\n", buf, comment); } } else { return printf("%s=%s\r\n", key, value); } } +int Cmdb::printcomment(const char *comment, const int width) { + return printf("%-*s; %s\r\n", width, "", comment); +} + char Cmdb::printch(const char ch) { return serial.putc(ch); } +//Mode=1 ; Profile Position Mode +//1234567890123456789012 + //------------------------------------------------------------------------------ void Cmdb::init(const char full) { @@ -565,18 +590,15 @@ endptr = (char*)toks[i]; - //Cardinal Types switch (typ) { + //Signed Cardinal Types case 'd' : //Check mod case 'i' : //Check mod - case 'u' : //Check mod - case 'o' : //Check mod - case 'x' : //Check mod switch (mod) { case 'b' : //char //test range l=strtol((char*)toks[i], &endptr, base); - if (l>=MIN_BYTE && l<=MAX_BYTE) { + if (l>=MIN_CHAR && l<=MAX_CHAR) { parms[i].type=PARM_CHAR; parms[i].val.uc =(unsigned char)l; } else { @@ -618,6 +640,57 @@ } break; + + //Unsigned Cardinal Types + case 'u' : //Check mod + case 'o' : //Check mod + case 'x' : //Check mod + switch (mod) { + case 'b' : //char + //test range + l=strtol((char*)toks[i], &endptr, base); + if (l>=MIN_BYTE && l<=MAX_BYTE) { + parms[i].type=PARM_CHAR; + parms[i].val.uc =(unsigned char)l; + } else { + error = i+1; + } + + break; + case 'h' : //short + l=strtol((char*)toks[i], &endptr, base); + if (l>=MIN_USHORT && l<=MAX_USHORT) { + parms[i].type=PARM_SHORT; + parms[i].val.w=(short)l; + } else { + error = i+1; + } + + break; + case 'l' : //long + l=strtol((char*)toks[i], &endptr, base); + parms[i].type=PARM_LONG; + parms[i].val.l=l; + + break; + default: //int + l=strtol((char*)toks[i], &endptr, base); + if (l>=MIN_UINT && l<=MAX_UINT) { + parms[i].type=PARM_INT; + parms[i].val.l=(int)l; + } else { + error = i+1; + } + break; + } + + if (error==0 && + (endptr==toks[i] //No Conversion at all. + || *endptr)) { //Incomplete conversion. + error = i+1; + } + + break; } //Floating Point Types