Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct CMDS {
- const char* name;
- char len;
- };
- struct CMDS comm[] = { {"CONNECT", 7}, {"CONNECT_OK", 10}, {"GET_VER", 7}, {"GET_DATA", 8}, {"GET_FILE", 8}, {"GET_COMMAND", 11}, {"GET_B64", 7}, {"DISCONNECT", 10}, {"VERSION ", 8}, {"B64: ", 5}, {"DISCONNECT_OK", 13} };
- enum PreviousMess { WRONG, RIGHT };
- char dataValid[127] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 };
- char b64Valid[127] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, };
- char CheckDirection(int* state, enum Direction direct);
- char CheckState(int* prevState, int* state, enum Direction direct, enum PreviousMess* message, char* str, char** cmd);
- void Mistake(messagePtr, statePtr, prevStatePtr);
- void True(messagePtr, statePtr, prevStatePtr);
- char CheckCMD(char* str, char** cmd);
- char CheckVer(char* str);
- char CheckB64(char* str);
- int state = 1;
- int prevState = 1;
- enum PreviousMess message = WRONG;
- char* cmd[12];
- char* prevComm[20];
- int* statePtr = &state;
- int* prevStatePtr = &prevState;
- enum PreviousMess* messagePtr = &message;
- char** cmdPtr = &cmd;
- char** prevCommPtr = &prevComm;
- enum test_status validate_message( struct Message *msg ) {
- // TODO: Implement me
- if (!CheckState(prevStatePtr, statePtr, msg->direction, messagePtr, cmdPtr, prevCommPtr))
- return MESSAGE_INVALID;
- return MESSAGE_VALID;
- }
- char CheckDirection(int* state, enum Direction direct) {
- switch (*state) {
- case 1: {
- if (direct != A_TO_B)
- return 0;
- break;
- }
- case 2: {
- if (direct != B_TO_A)
- return 0;
- break;
- }
- case 3: {
- if (direct != A_TO_B)
- return 0;
- break;
- }
- case 4: {
- if (direct != B_TO_A)
- return 0;
- break;
- }
- case 5: {
- if (direct != B_TO_A)
- return 0;
- break;
- }
- case 6: {
- if (direct != B_TO_A)
- return 0;
- break;
- }
- case 7: {
- if (direct != B_TO_A)
- return 0;
- break;
- }
- default: return 0;
- }
- return 1;
- }
- void Mistake(messagePtr, statePtr, prevStatePtr) {
- messagePtr = WRONG;
- prevStatePtr = statePtr;
- statePtr = 1;
- }
- void True(messagePtr, statePtr, prevStatePtr) {
- messagePtr = RIGHT;
- prevStatePtr = statePtr;
- }
- char CheckVer(char* str) {
- int len = strlen(str);
- if (len <= 8)
- return 0;
- char* tmp = malloc(10);
- strncpy_s(tmp, 0, str, 7);
- if (strcmp(tmp, comm[8].name)) {
- free(tmp);
- return 0;
- }
- tmp = "";
- strncpy_s(tmp, 8, str, len - 1);
- int k = atoi(tmp);
- if (k <= 0) {
- free(tmp);
- return 0;
- }
- return 1;
- }
- char CheckB64(char* str) {
- int len = strlen(str);
- if (len <= 5)
- return 0;
- char* tmp = malloc(10);
- strncpy_s(tmp, 0, str, 4);
- if (strcmp(tmp, comm[9].name)) {
- free(tmp);
- return 0;
- }
- free(tmp);
- for (int i = 5; i < len - 2; i++) {
- if (!b64Valid[str[i]])
- return 0;
- }
- if ((str[len - 2] != '=' && !b64Valid[str[len - 2]])
- || (str[len - 1] != '=' && !b64Valid[str[len - 1]]))
- return 0;
- return 1;
- }
- char CheckCMD(char* str, char** cmd) {
- int len = strlen(str);
- int len2 = strlen(*cmd);
- if (len <= len2 * 2 + 2)
- return 0;
- char* tmp = malloc(len2 + 2);
- strncpy_s(tmp, 0, str, len2);
- if (strcmp(tmp, *cmd) != 0) {
- free(tmp);
- return 0;
- }
- if (str[len2] != ' ' || str[len - len2 - 1] != ' ') {
- free(tmp);
- return 0;
- }
- for (int i = len2 + 1; i < len - len2 - 1; i++) {
- if ((!dataValid[str[i]])) {
- free(tmp);
- return 0;
- }
- }
- strncpy_s(tmp, len - len2, str, len - 1);
- if (strcmp(tmp, *cmd) != 0) {
- free(tmp);
- return 0;
- }
- free(tmp);
- return 1;
- }
- char CheckState(int* prevState, int* state, enum Direction direct, enum PreviousMess* message, char* str, char** cmd) {
- if (!CheckDirection(statePtr, direct)) {
- Mistake(messagePtr, statePtr, prevStatePtr);
- return 0;
- }
- switch (*state) {
- case 1: {
- if (strcmp(str, comm[0].name) != 0 || *message != WRONG && prevState != 7) {
- Mistake(messagePtr, statePtr, prevStatePtr);
- return 0;
- }
- True(messagePtr, statePtr, prevStatePtr);
- *state = 2;
- return 1;
- }
- case 2: {
- if (strcmp(str, comm[1].name) != 0 || *message != WRONG && prevState != 1) {
- Mistake(messagePtr, statePtr, prevStatePtr);
- return 0;
- }
- True(messagePtr, statePtr, prevStatePtr);
- *state = 3;
- return 1;
- }
- case 3: {
- if (*message == WRONG || (prevState != 4
- && prevState != 5 && prevState != 7)) {
- Mistake(messagePtr, statePtr, prevStatePtr);
- return 0;
- }
- if (strcmp(str, comm[2].name) == 0)
- *state = 4;
- else if (strcmp(str, comm[3].name) == 0
- || strcmp(str, comm[4].name) == 0 || strcmp(str, comm[5].name) == 0)
- *state = 5;
- else if (strcmp(str, comm[6].name) == 0)
- *state = 6;
- else if (strcmp(str, comm[7].name) == 0)
- *state = 7;
- else {
- Mistake(messagePtr, statePtr, prevStatePtr);
- return 0;
- }
- True(messagePtr, statePtr, prevStatePtr);
- *state = 3;
- return 1;
- }
- case 4: {
- if (strcmp(*cmd, comm[8].name) != 0 || *message == WRONG
- || !CheckVer(str) || prevState != 3) {
- Mistake(messagePtr, statePtr, prevStatePtr);
- return 0;
- }
- True(messagePtr, statePtr, prevStatePtr);
- *state = 3;
- return 1;
- }
- case 5: {
- if ( *message == WRONG || !CheckCMD(str, prevCommPtr)
- || prevState != 3) {
- Mistake(messagePtr, statePtr, prevStatePtr);
- return 0;
- }
- True(messagePtr, statePtr, prevStatePtr);
- *state = 3;
- return 1;
- }
- case 6: {
- if (strcmp(*cmd, comm[9].name) != 0 || !CheckB64(str)
- || *message == WRONG || prevState != 3) {
- Mistake(messagePtr, statePtr, prevStatePtr);
- return 0;
- }
- True(messagePtr, statePtr, prevStatePtr);
- *state = 3;
- return 1;
- }
- case 7: {
- if (strcmp(str, comm[10].name) != 0 || *message == WRONG || prevState != 3) {
- Mistake(messagePtr, statePtr, prevStatePtr);
- return 0;
- }
- True(messagePtr, statePtr, prevStatePtr);
- *state = 1;
- return 1;
- }
- default: return 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement