File System mit einen Argument

Dependencies:   mbed

Revision:
0:6791a518728e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/parser.cpp	Mon Nov 14 17:07:21 2016 +0000
@@ -0,0 +1,96 @@
+#include "parser.h"
+#include <cctype>
+
+// functions
+char* normalizeStr(char* theArr) {
+    int i=0;
+    string myStr, bestStr;
+    myStr.assign(theArr);
+    while (myStr[i]) {  // replace all white spaces into spaces (0x20)
+        if (isspace(myStr[i])) 
+            myStr[i]=' ';
+        i++;
+    }
+    myStr.erase(0, myStr.find_first_not_of(" "));  // remove leading spaces 
+    myStr.erase(myStr.find_last_not_of(" ")+1);  // remove trailing spaces
+    strcpy(theArr, myStr.c_str());
+    int x = 0;
+    for (i=0; i<=myStr.length(); i++) {
+        theArr[x] = myStr[i]; 
+        if (x>=1) {
+            if ((theArr[x] == ' ') && (theArr[x-1] == ' ')) // reduce several spaces to one space
+                x--;
+            if ((theArr[x] == ';') && (theArr[x-1] == ' ')) // delete every space before ';'
+                theArr[--x] = ';';
+        } 
+        x++;    
+        if (theArr[x-1] == ';')             
+            break; // ignore everything after ';' 
+    }
+    theArr[x] = '\0';
+    if (x>1) {
+     if ((theArr[0] == '/') && (theArr[1] == '/'))
+        theArr[0] = 0;  // ignore comments 
+    }
+    return theArr;
+}
+
+bool getArg(int16_t myCom[], string myItem) { // keyword specific argument handling
+    bool done=true;
+    switch (myCom[0]) {
+        case 1: // LEDS
+            if (myItem[0] == 'E') myCom[1]=0x0F;
+            else if (myItem[0] == 'A') myCom[1]=0;
+            else myCom[1] = (int16_t)std::strtol(myItem.c_str(), NULL, 10);
+            break;       
+        case 2: // WAIT 
+        case 3: // REPEAT
+        case 4: // GOTO
+            myCom[1] = (int16_t)std::strtol(myItem.c_str(), NULL, 10); 
+            break;
+            
+            case 5: //END
+            break;
+            case 6: //NOP
+            break;
+            case 7:
+            myCom[1] = (int16_t)std::strtol(myItem.c_str(), NULL, 10);//TONE
+            break;  
+            
+       
+        default: myCom[1]= myCom[0]*-1; done=false; break;
+    }
+//  printf("... getArg: myItem=<%s>;   %s %d\r\n", myItem.c_str(), keywords[myCom[0]].c_str(), myCom[1]); 
+    return done;
+}
+
+bool parseLine(string line, int16_t command[]) { // parse a normalized command line
+    bool done = false;
+    int i=0;
+
+    size_t pos = line.find_first_of(" ;");  // find first ' ' or ';' in string
+    string theItem = line.substr(0, pos); 
+    for (i=1; i <= validKeyWords; i++) {
+        if (keywords[i].compare(theItem)==0) {  // compare keyword with keywords in list (array)
+            command[0] = i;             // store no representation of the found keyword in command[0]
+            if (line[pos] == ';') {
+                done = true;
+                command[1] = -101;  
+            }
+            else {
+                line.erase(0, line.find_first_of(" ")+1); // remove keyword from string
+                pos = line.find_first_of(";\r");    // error tolerant: if line is not completed with ';'; --> '\r\n' .. end of line
+                if (pos >0) {
+                    theItem = line.substr(0, pos); 
+                    done = getArg(command, theItem);    // handling of a second arument depending on the keyword
+                }
+                else {
+                    command[1] = -102;
+                    done = false;
+                }
+            }
+            break;  // keyword found
+        }
+    } // for
+    return done;
+}