Mateusz Garwol / Mbed 2 deprecated 2_5

Dependencies:   LCD_DISCO_F429ZI mbed BSP_DISCO_F429ZI

Committer:
matis755
Date:
Wed May 20 16:37:25 2020 +0000
Revision:
3:6fc7976cc5bf
Parent:
2:8788d711db7e
Create class for decoding strings

Who changed what in which revision?

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