Ochojski Piotr Dekodowanie komunikatów
#define MAX_TOKEN_NR 3
#define MAX_KEYWORD_STRING_LTH 10
#define MAX_KEYWORD_NR 3
typedef enum TokenType {KEYWORD, NUMBER, STRING};
typedef enum KeywordCode { LD, ST, RST};
typedef struct Keyword
{
enum KeywordCode eCode;
char cString[MAX_KEYWORD_STRING_LTH + 1];
};
typedef union TokenValue
enum KeywordCode eKeyword; // jezeli KEYWORD
unsigned int uiNumber; // jezeli NUMBER
char * pcString; // jezeli STRING
typedef struct Token
enum TokenType eTokenType; // KEYWORD, NUMBER, STRING
union TokenValue uValue; // enum, unsigned int, char*
typedef struct Keyword asKeywordList[MAX_KEYWORD_NR]=
{RST, "reset" },
{LD, "load" },
{ST, "store" }
typedef struct Token asToken[MAX_TOKEN_NR];
unsigned char ucTokenNr;
asKeywordList[];
asToken[];
// FUNKCJA 1----------------------------------------------------------------------------
unsigned char ucFindTokensInString( char *pcString )
enum TokenAutomat{TOKEN, DELIMITER};
enum TokenAutomat eTokenAutomat = DELIMITER;
unsigned char ucLoopCounter;
unsigned char ucCharMem;
ucTokenNr = 0;
for(ucLoopCounter = 0;;ucLoopCounter++)
ucCharMem = pcString[ucLoopCounter];
switch( eTokenAutomat )
case TOKEN:
if( ' ' == ucCharMem )
eTokenAutomat = DELIMITER;
}
else if( NULL == ucCharMem )
return ucTokenNr;
else if( MAX_TOKEN_NR == ucTokenNr )
else
eTokenAutomat = TOKEN;
break;
case DELIMITER:
if ( NULL == ucCharMem )
else if ( ' ' == ucCharMem )
eTokenState = DELIMITER;
asToken[ucTokenNr].uValue.pcString = pcString+ucLoopCounter;
ucTokenNr++;
// FUNKCJA 2----------------------------------------------------------------------------
enum Result eStringToKeyword( char pcStr[],enum KeywordCode *peKeyword )
for( ucLoopCounter = 0 ; ucLoopCounter < MAX_KEYWORD_NR ; ucLoopCounter++ )
if (EQUAL == eCompareString( pcStr, asKeywordList[ucLoopCounter].cString))
*peKeyword = asKeywordList[ucLoopCounter].eCode;
return OK;
return ERROR;
// FUNKCJA 3----------------------------------------------------------------------------
void DecodeTokens(void)
enum TokenType *eTokenType;
unsigned int *uiValue;
char *pcString;
unsigned int iTokenValue;
for(ucLoopCounter = 0 ; ucLoopCounter < ucTokenNr ; ucLoopCounter++ )
pcString &= asToken[ucLoopCounter].uValue.pcString;
eTokenType &=( asToken[ucLoopCounter].eTokenType );
uiValue &=( asToken[ucLoopCounter].uValue.uiNumber );
if( OK == eStringToKeyword( pcString, &asToken[ucLoopCounter].uValue.eKeyword ) )
*eTokenType=KEYWORD;
else if(OK == eHexStringToUInt( pcString, &iTokenValue ) )
*eTokenType = NUMBER;
*uiValue = iTokenValue;
*eTokenType = STRING;
// FUNKCJA 4----------------------------------------------------------------------------
void DecodeMsg(char *pcString)
ucTokenNr = ucFindTokensInString( pcString );
ReplaceCharactersInString( pcString,' ',NULL );
DecodeTokens();
str. 4
Odziom_IM