Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: LCD_DISCO_F429ZI mbed BSP_DISCO_F429ZI
string.cpp@3:6fc7976cc5bf, 2020-05-20 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |