Oddanie
DECODER.cpp@0:f6e7c3ad5a58, 2020-05-18 (annotated)
- Committer:
- lolkusus
- Date:
- Mon May 18 17:08:10 2020 +0000
- Revision:
- 0:f6e7c3ad5a58
- Child:
- 1:288ebe73ba81
Oddanie;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |