Oddanie

Dependents:   MBED2-5

Committer:
lolkusus
Date:
Mon May 18 17:08:10 2020 +0000
Revision:
0:f6e7c3ad5a58
Child:
1:288ebe73ba81
Oddanie;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lolkusus 0:f6e7c3ad5a58 1 #include "DECODER.h"
lolkusus 0:f6e7c3ad5a58 2
lolkusus 0:f6e7c3ad5a58 3 struct Keyword asKeywordList[MAX_KEYWORD_NR]=
lolkusus 0:f6e7c3ad5a58 4 { {ID,"id"},
lolkusus 0:f6e7c3ad5a58 5 {CALLIB, "callib"},
lolkusus 0:f6e7c3ad5a58 6 {GOTO, "goto"},
lolkusus 0:f6e7c3ad5a58 7 {STEP, "step"}
lolkusus 0:f6e7c3ad5a58 8 };
lolkusus 0:f6e7c3ad5a58 9
lolkusus 0:f6e7c3ad5a58 10 enum CompResult Decoder::eCompareString(char pcStr1[], char pcStr2[])
lolkusus 0:f6e7c3ad5a58 11 {
lolkusus 0:f6e7c3ad5a58 12 unsigned char ucCharCounter;
lolkusus 0:f6e7c3ad5a58 13 for(ucCharCounter=0;pcStr1[ucCharCounter] != '\0';ucCharCounter++)
lolkusus 0:f6e7c3ad5a58 14 {
lolkusus 0:f6e7c3ad5a58 15 if (pcStr1[ucCharCounter] != pcStr2[ucCharCounter]) return DIFFERENT;
lolkusus 0:f6e7c3ad5a58 16 }
lolkusus 0:f6e7c3ad5a58 17 return EQUAL;
lolkusus 0:f6e7c3ad5a58 18 }
lolkusus 0:f6e7c3ad5a58 19
lolkusus 0:f6e7c3ad5a58 20 void Decoder::ReplaceCharactersInString(char pcString[],char cOldChar,char cNewChar)
lolkusus 0:f6e7c3ad5a58 21 {
lolkusus 0:f6e7c3ad5a58 22 unsigned char ucCharCounter;
lolkusus 0:f6e7c3ad5a58 23 for(ucCharCounter=0;pcString[ucCharCounter]!='\0';ucCharCounter++)
lolkusus 0:f6e7c3ad5a58 24 {
lolkusus 0:f6e7c3ad5a58 25 if(pcString[ucCharCounter] == cOldChar) pcString[ucCharCounter] = cNewChar;
lolkusus 0:f6e7c3ad5a58 26 }
lolkusus 0:f6e7c3ad5a58 27 }
lolkusus 0:f6e7c3ad5a58 28
lolkusus 0:f6e7c3ad5a58 29 enum Result Decoder::eHexStringToUInt(char pcStr[],unsigned int *puiValue)
lolkusus 0:f6e7c3ad5a58 30 {
lolkusus 0:f6e7c3ad5a58 31 unsigned char ucCharCounter;
lolkusus 0:f6e7c3ad5a58 32 if((pcStr[0] != '0') | (pcStr[1] != 'x') | (pcStr[2] == '\0'))
lolkusus 0:f6e7c3ad5a58 33 return ERR;
lolkusus 0:f6e7c3ad5a58 34 *puiValue = 0;
lolkusus 0:f6e7c3ad5a58 35 for(ucCharCounter=2;ucCharCounter<7;ucCharCounter++)
lolkusus 0:f6e7c3ad5a58 36 {
lolkusus 0:f6e7c3ad5a58 37 if(pcStr[ucCharCounter] == '\0')
lolkusus 0:f6e7c3ad5a58 38 return OK;
lolkusus 0:f6e7c3ad5a58 39 *puiValue = *puiValue << 4;
lolkusus 0:f6e7c3ad5a58 40 if(pcStr[ucCharCounter] >= 'A')
lolkusus 0:f6e7c3ad5a58 41 *puiValue = *puiValue | (pcStr[ucCharCounter] - 'A' + 10);
lolkusus 0:f6e7c3ad5a58 42 else
lolkusus 0:f6e7c3ad5a58 43 *puiValue = *puiValue | (pcStr[ucCharCounter] - '0');
lolkusus 0:f6e7c3ad5a58 44 }
lolkusus 0:f6e7c3ad5a58 45 return OK;
lolkusus 0:f6e7c3ad5a58 46 }
lolkusus 0:f6e7c3ad5a58 47
lolkusus 0:f6e7c3ad5a58 48 unsigned char Decoder::ucFindTokensInString(char *pcString)
lolkusus 0:f6e7c3ad5a58 49 {
lolkusus 0:f6e7c3ad5a58 50 unsigned char ucTokenPointer;
lolkusus 0:f6e7c3ad5a58 51 unsigned char ucDelimiterCounter;
lolkusus 0:f6e7c3ad5a58 52 char cCurrentChar;
lolkusus 0:f6e7c3ad5a58 53 enum State {TOKEN, DELIMITER};
lolkusus 0:f6e7c3ad5a58 54 enum State eState = DELIMITER;
lolkusus 0:f6e7c3ad5a58 55 ucDelimiterCounter = 0;
lolkusus 0:f6e7c3ad5a58 56
lolkusus 0:f6e7c3ad5a58 57 for(ucTokenPointer=0;;ucTokenPointer++)
lolkusus 0:f6e7c3ad5a58 58 {
lolkusus 0:f6e7c3ad5a58 59 cCurrentChar = pcString[ucTokenPointer];
lolkusus 0:f6e7c3ad5a58 60 switch(eState)
lolkusus 0:f6e7c3ad5a58 61 {
lolkusus 0:f6e7c3ad5a58 62 case DELIMITER:
lolkusus 0:f6e7c3ad5a58 63 if(cCurrentChar == '\0')
lolkusus 0:f6e7c3ad5a58 64 return ucDelimiterCounter;
lolkusus 0:f6e7c3ad5a58 65 else if(cCurrentChar == ' ') {}
lolkusus 0:f6e7c3ad5a58 66 else
lolkusus 0:f6e7c3ad5a58 67 {
lolkusus 0:f6e7c3ad5a58 68 eState = TOKEN;
lolkusus 0:f6e7c3ad5a58 69 asToken[ucDelimiterCounter].uValue.pcString = pcString+ucTokenPointer;
lolkusus 0:f6e7c3ad5a58 70 asToken[ucDelimiterCounter].eType = KEYWORD; //not empty
lolkusus 0:f6e7c3ad5a58 71 ucDelimiterCounter++;
lolkusus 0:f6e7c3ad5a58 72 }
lolkusus 0:f6e7c3ad5a58 73 break;
lolkusus 0:f6e7c3ad5a58 74 case TOKEN:
lolkusus 0:f6e7c3ad5a58 75 if(cCurrentChar == '\0')
lolkusus 0:f6e7c3ad5a58 76 return ucDelimiterCounter;
lolkusus 0:f6e7c3ad5a58 77 else if(ucDelimiterCounter == MAX_TOKEN_NR)
lolkusus 0:f6e7c3ad5a58 78 return ucDelimiterCounter;
lolkusus 0:f6e7c3ad5a58 79 else if(cCurrentChar != ' ') {}
lolkusus 0:f6e7c3ad5a58 80 else
lolkusus 0:f6e7c3ad5a58 81 eState = DELIMITER;
lolkusus 0:f6e7c3ad5a58 82 break;
lolkusus 0:f6e7c3ad5a58 83 }
lolkusus 0:f6e7c3ad5a58 84 }
lolkusus 0:f6e7c3ad5a58 85 }
lolkusus 0:f6e7c3ad5a58 86
lolkusus 0:f6e7c3ad5a58 87 enum Result Decoder::eStringToKeyword (char pcStr[],enum KeywordCode *peKeywordCode)
lolkusus 0:f6e7c3ad5a58 88 {
lolkusus 0:f6e7c3ad5a58 89 unsigned char ucTokenCounter;
lolkusus 0:f6e7c3ad5a58 90 for(ucTokenCounter=0;ucTokenCounter<MAX_KEYWORD_NR;ucTokenCounter++)
lolkusus 0:f6e7c3ad5a58 91 {
lolkusus 0:f6e7c3ad5a58 92 if (eCompareString(pcStr,asKeywordList[ucTokenCounter].cString) == EQUAL)
lolkusus 0:f6e7c3ad5a58 93 {
lolkusus 0:f6e7c3ad5a58 94 *peKeywordCode = asKeywordList[ucTokenCounter].eCode;
lolkusus 0:f6e7c3ad5a58 95 return OK;
lolkusus 0:f6e7c3ad5a58 96 }
lolkusus 0:f6e7c3ad5a58 97 }
lolkusus 0:f6e7c3ad5a58 98 return ERR;
lolkusus 0:f6e7c3ad5a58 99 }
lolkusus 0:f6e7c3ad5a58 100
lolkusus 0:f6e7c3ad5a58 101 enum Result Decoder::DecodeTokens()
lolkusus 0:f6e7c3ad5a58 102 {
lolkusus 0:f6e7c3ad5a58 103 unsigned char ucTokenCounter;
lolkusus 0:f6e7c3ad5a58 104 Token* tValue;
lolkusus 0:f6e7c3ad5a58 105 for(ucTokenCounter=0;ucTokenCounter<MAX_TOKEN_NR;ucTokenCounter++)
lolkusus 0:f6e7c3ad5a58 106 {
lolkusus 0:f6e7c3ad5a58 107 tValue = &asToken[ucTokenCounter];
lolkusus 0:f6e7c3ad5a58 108 if ((tValue->uValue.pcString == '\0') || (tValue->eType == EMPTY)) break;
lolkusus 0:f6e7c3ad5a58 109 if (eStringToKeyword(tValue->uValue.pcString,&tValue->uValue.eKeyword) == OK) tValue->eType = KEYWORD;
lolkusus 0:f6e7c3ad5a58 110 else if (eHexStringToUInt(tValue->uValue.pcString,&tValue->uValue.uiNumber) == OK) tValue->eType = NUMBER;
lolkusus 0:f6e7c3ad5a58 111 else return ERR;
lolkusus 0:f6e7c3ad5a58 112 }
lolkusus 0:f6e7c3ad5a58 113 return OK;
lolkusus 0:f6e7c3ad5a58 114 }
lolkusus 0:f6e7c3ad5a58 115
lolkusus 0:f6e7c3ad5a58 116 enum Result Decoder::DecodeMsg(char *pcString)
lolkusus 0:f6e7c3ad5a58 117 {
lolkusus 0:f6e7c3ad5a58 118 unsigned char ucTokenCounter;
lolkusus 0:f6e7c3ad5a58 119 for(ucTokenCounter=0;ucTokenCounter<MAX_TOKEN_NR;ucTokenCounter++)
lolkusus 0:f6e7c3ad5a58 120 {
lolkusus 0:f6e7c3ad5a58 121 asToken[ucTokenCounter].eType = EMPTY;
lolkusus 0:f6e7c3ad5a58 122 }
lolkusus 0:f6e7c3ad5a58 123
lolkusus 0:f6e7c3ad5a58 124 ucFindTokensInString(pcString);
lolkusus 0:f6e7c3ad5a58 125 ReplaceCharactersInString(pcString,' ','\0');
lolkusus 0:f6e7c3ad5a58 126 if(DecodeTokens() == ERR)
lolkusus 0:f6e7c3ad5a58 127 return ERR;
lolkusus 0:f6e7c3ad5a58 128 else
lolkusus 0:f6e7c3ad5a58 129 return OK;
lolkusus 0:f6e7c3ad5a58 130 }