User info | |
---|---|
User name: | niross |
Bio: | #include "stdafx.h"
#include <string.h> #define VALID 1 #define INVALID 0 #define A_B 0 #define B_A 1 #define ARR_SIZE 25 typedef struct{ char cmdArr[ARR_SIZE]; bool AorB; }cmd_s; typedef struct{ char cmdArr[ARR_SIZE]; int size; }cmd3_s; /* Global Variables */ cmd_s Cmd; cmd3_s Cmd3; void fillArr(char destArr[], const char sourceArr[], const int size){ memset(destArr, 0, ARR_SIZE); memcpy(destArr, sourceArr, size); } bool isCmd(const char * cmd_t, const int size){ if(strncmp(Cmd.cmdArr, cmd_t, size) == 0) return 1; return 0; } int checkCmd(bool drction, char * cmd_t, int size, int *statePtr, int dest_state){ if(Cmd.AorB == drction ) if(isCmd(cmd_t, size)){ *statePtr = dest_state; return VALID; } *statePtr = 1; return INVALID; } void saveCmd3(const char sourceArr[], const int size) { fillArr(Cmd3.cmdArr, sourceArr, size); Cmd3.size = size - 1; //don't count the '/0' } int checkState3(int *statePtr) { int status = (checkCmd(A_B, "LIST", sizeof("LIST"), statePtr, 4)); saveCmd3("LIST", sizeof("LIST")); // other possible commands ... if(status == INVALID) { status = (checkCmd(A_B, "EXIT ", sizeof("EXIT "), statePtr, 5)); } return status; } int getCmdLen() { int i=0; int cnt=0; for(i=0; i<ARR_SIZE; i++){ if(Cmd.cmdArr[i] != '\0') cnt++; } return cnt; } int checkCh(char ch) { if((ch >='a') && (ch <='z')) return VALID; if((ch >='0') && (ch <='9')) return VALID; return INVALID; } int checkState4(int *statePtr) { int cmdSize = getCmdLen(); int cmd3Sise = Cmd3.size; int SecondIdx = cmdSize - cmd3Sise; int i; *statePtr = 1; if(cmdSize < cmd3Sise*2 + 2) return INVALID; if(strncmp(&Cmd.cmdArr[0], Cmd3.cmdArr, cmd3Sise) != 0) return INVALID; if(strncmp(&Cmd.cmdArr[SecondIdx], Cmd3.cmdArr, cmd3Sise) != 0) return INVALID; // check the msg for(i = cmd3Sise+1; i<= SecondIdx-2 ; i++ ) if(checkCh(Cmd.cmdArr[i]) == INVALID) return INVALID; *statePtr = 3; return VALID; } int handleCmd() { static int stat_state = 1; switch(stat_state) { case 1: return (checkCmd(A_B, "OPEN_CONNECTION", sizeof("OPEN_CONNECTION"), &stat_state, 2)); case 2: return (checkCmd(B_A, "OPEN_CONNECTION_ACKED", sizeof("OPEN_CONNECTION_ACKED"), &stat_state, 3)); case 3: return (checkState3(&stat_state)); case 4: return (checkState4(&stat_state)); case 5: return (checkCmd(B_A, "EXIT_ACKED", sizeof("EXIT_ACKED"), &stat_state, 1)); default: return INVALID; } } int _tmain(int argc, _TCHAR* argv[]) { // init memset(&Cmd, 0, sizeof(Cmd) ); memset(&Cmd3, 0, sizeof(Cmd3)); Cmd.AorB = A_B; fillArr(Cmd.cmdArr, "OPEN_CONNECTION", sizeof("OPEN_CONNECTION")); handleCmd(); Cmd.AorB = B_A; fillArr(Cmd.cmdArr, "OPEN_CONNECTION_ACKED", sizeof("OPEN_CONNECTION_ACKED")); handleCmd(); Cmd.AorB = A_B; fillArr(Cmd.cmdArr, "LIST", sizeof("LIST")); handleCmd(); Cmd.AorB = B_A; fillArr(Cmd.cmdArr, "LIST 6575 LIST", sizeof("LIST 6575 LIST")); handleCmd(); return 0; } |
History | |
Joined: | |
Number of posts: | 1 |
Latest posts: |
This user does not accept Private Messages