Keyboard Converter for 5 Keys
(1) Fetch keyboard input sequence
(2) Normalize key seqeunce so that only key "1" ~ "5" is taken
(3) Decode key and process
(4) Output
/**************************************************************/ /* bobo */ /* 20230211 */ /* Keyboard Converter for 5-Key Keyboard */ /**************************************************************/ #include <stdio.h> /* Defines */ #define SIZE_KEY_SEQUENCE 100 #define SIZE_CLIP_BOARD 100 #define SIZE_SCREEN 100 #define STATUS_VERSION VERSION_NORMAL #define VERSION_DEBUG 0 #define VERSION_NORMAL 1 #define FLAG_INCOMPLETE 0 #define FLAG_COMPLETE 1 #define FLAG_ERROR 2 /* Structures */ /* Function Prototypes*/ int key_sequence_normalize(char*, char*, int); int key_sequence_decode(char*, char*, char*, int); int screen_count(char*, int); /* Globals */ /* To-do List*/ /* * (1) structural program that can run * (2) implementation * (3) standarized input / output * (4) error detction and process */ int main() { /* Explore the C World */ /* Variables */ char in_char_key_sequence[SIZE_KEY_SEQUENCE] = { 0 }; char inter_char_clipboard[SIZE_CLIP_BOARD] = { 0 }; char inter_char_screen[SIZE_SCREEN] = { 0 }; char inter_char_key_sequence_std[SIZE_KEY_SEQUENCE] = { 0 }; int out_int_num = 0, out_int_size_word_sys = 0; /* Input Interface Selection */ #if(STATUS_VERSION == VERSION_DEBUG) /* Welcoming Information */ printf("Welcome to 5-Key Keyboard Conversion Porgam! \n"); /* System Information */ out_int_size_word_sys = sizeof(int); printf("Word Length of Integer Type of Current System is: %lu \n", out_int_size_word_sys); #elif(STATUS_VERSION == VERSION_NORMAL) /* Standard Input */ #endif /* Step 01. Fetch Input */ fgets(in_char_key_sequence, SIZE_KEY_SEQUENCE, stdin); /* Step 02. Process */ key_sequence_normalize(inter_char_key_sequence_std, in_char_key_sequence, SIZE_KEY_SEQUENCE); key_sequence_decode(inter_char_clipboard, inter_char_screen, inter_char_key_sequence_std, \ SIZE_KEY_SEQUENCE); out_int_num = screen_count(inter_char_screen, SIZE_KEY_SEQUENCE); /* Step 03. Drive Output */ /* Output Interface Selection */ #if(STATUS_VERSION == VERSION_DEBUG) printf("Number of Characters is: %d", out_int_num); #elif(STATUS_VERSION == VERSION_NORMAL) /* * puts(inter_char_key_sequence_std); * puts(inter_char_screen); * puts(inter_char_clipboard); */ printf("%d \n", out_int_num); #endif /* Return */ return 0; } int key_sequence_normalize(char* out_sequence, char* in_seqeunce, int in_num_valid) { /* You should know that a space will not be taken */ /* Variables */ int index_key_in = 0; int index_key_out = 0; /* func 01 step 01. look for correct keys */ for (index_key_in = 0; index_key_in < in_num_valid; index_key_in++) { if (in_seqeunce[index_key_in] > '0' && in_seqeunce[index_key_in] < '6') { out_sequence[index_key_out] = in_seqeunce[index_key_in]; index_key_out++; } } return FLAG_COMPLETE; } int key_sequence_decode(char* out_clipboard, char* out_screen, char* in_key_sequence, \ int in_num_valid) { /* Decode normalized key sequence, that is continuous number (1 ~ 5) string */ /* This function has no external storage, that is it starts over from the * beginning every time it is called */ /* Variables */ int index_key = 0, key_current = 0, ptr_clipboard = 0, ptr_screen = 0; int index_char = 0, index_char_2 = 0, num_sel = 0, num_ins = 0, num_rem = 0, num_ext = 0; int ptr_screen_sel_stt = 0, ptr_screen_sel_stp = 0, ptr_screen_sel_swap = 0; /* func 02 step 01. iterate key elements */ for (index_key = 0; index_key < in_num_valid; index_key++) { /* Determine number of selected characters */ if (ptr_screen_sel_stp < ptr_screen_sel_stt) { ptr_screen_sel_swap = ptr_screen_sel_stt; ptr_screen_sel_stt = ptr_screen_sel_stp; ptr_screen_sel_stp = ptr_screen_sel_swap; } else { /* Do nothing */ } num_sel = ptr_screen_sel_stp - ptr_screen_sel_stt; /* Decode */ switch (in_key_sequence[index_key]) { case '1': /* Output character "a" to the screen */ key_current = 1; /* Process */ if (num_sel > 0) { /* Clear */ for (index_char = 0; index_char < num_sel; index_char++) { out_screen[ptr_screen_sel_stt + index_char] = '\0'; } /* Insert */ num_ins = 1; out_screen[ptr_screen_sel_stt] = 'a'; /* Move */ num_rem = ptr_screen - ptr_screen_sel_stp; for (index_char = 0; index_char < num_rem; index_char++) { out_screen[ptr_screen_sel_stt + num_ins + index_char] = out_screen\ [ptr_screen_sel_stp + index_char]; out_screen[ptr_screen_sel_stp + index_char] = '\0'; } ptr_screen = ptr_screen - num_sel + num_ins; /* Cancel selection */ ptr_screen_sel_stt = 0; ptr_screen_sel_stp = 0; } else { /* Add character at the end of the screen */ out_screen[ptr_screen] = 'a'; ptr_screen++; } break; case '2': /* Copy */ key_current = 2; if (num_sel > 0) { /* Clear previous clipboard content */ for (index_char = 0; index_char < ptr_clipboard; index_char++) { out_clipboard[index_char] = '\0'; } ptr_clipboard = 0; /* Add new clipboard content */ for (index_char = 0; index_char < num_sel; index_char++) { out_clipboard[index_char] = out_screen[ptr_screen_sel_stt + index_char]; ptr_clipboard++; } } else { /* Do nothing */ } break; case '3': /* Cut */ key_current = 3; if (num_sel > 0) { /* Clear previous clipboard content */ for (index_char = 0; index_char < ptr_clipboard; index_char++) { out_clipboard[index_char] = '\0'; } ptr_clipboard = 0; /* Add new clipboard content */ for (index_char = 0; index_char < num_sel; index_char++) { out_clipboard[index_char] = out_screen[ptr_screen_sel_stt + index_char]; out_screen[ptr_screen_sel_stt + index_char] = '\0'; ptr_clipboard++; ptr_screen--; } /* Cancel selection */ ptr_screen_sel_stt = 0; ptr_screen_sel_stp = 0; } else { /* Do nothing */ } break; case '4': /* Paste */ key_current = 4; /* Clear characters currently selected */ if (num_sel > 0) { /* Clear */ for (index_char = 0; index_char < num_sel; index_char++) { out_screen[ptr_screen_sel_stt + index_char] = '\0'; } /* Insert and move */ num_ins = ptr_clipboard; num_rem = ptr_screen - ptr_screen_sel_stp; if (num_ins <= num_sel) { /* Inserted no longer than deleted */ for (index_char = 0; index_char < num_ins; index_char++) { out_screen[ptr_screen_sel_stt + index_char] = out_clipboard[index_char]; } for (index_char = 0; index_char < num_rem; index_char++) { out_screen[ptr_screen_sel_stt + num_ins + index_char] = out_screen\ [ptr_screen_sel_stp + index_char]; ptr_screen--; } } else { /* Insterted longer than deleted */ num_ext = num_ins - num_sel; for (index_char = 0; index_char < num_sel; index_char++) { out_screen[ptr_screen_sel_stt + index_char] = out_clipboard[index_char]; } for (index_char = 0; index_char < num_ext; index_char++) { for (index_char_2 = 0; index_char_2 < num_rem; index_char_2++) { out_screen[ptr_screen - index_char_2] = out_screen[ptr_screen - \ index_char_2 - 1]; } ptr_screen++; out_screen[ptr_screen_sel_stp + index_char] = out_clipboard[num_sel + \ index_char]; } } /* Cancel selection */ ptr_screen_sel_stt = 0; ptr_screen_sel_stp = 0; } else { /* Add characters at the end of screen */ for (index_char = 0; index_char < ptr_clipboard; index_char++) { out_screen[ptr_screen] = out_clipboard[index_char]; ptr_screen++; } } break; case '5': /* Select all */ key_current = 5; ptr_screen_sel_stt = 0; ptr_screen_sel_stp = ptr_screen; break; default: break; } } return FLAG_COMPLETE; } int screen_count(char* in_screen, int in_num_valid) { /* Count numbers of characters on screen */ /* Variables */ int index_screen = 0; int out_num = 0; /* Count */ for (index_screen = 0; index_screen < in_num_valid; index_screen++) { if (in_screen[index_screen] == 'a') { out_num++; } else { /* Do nothing */ } } return out_num; } /* End of File */