//-------------------------------------------------------------------------------------------------- void NextionScrollingText::direction(NextionScrollingDirection val) { command_dir(val); }
/*------------------------------------------------------------------------ * MAIN PROGRAM *------------------------------------------------------------------------*/ int main(int argc, const char *argv[]) { command_t command; /* the current command being processed */ //char command_text[MAX_COMMAND_LENGTH]; /* the raw text of the command */ char *command_text; ttp_session_t *session = NULL; ttp_parameter_t parameter; int argc_curr = 1; /* command line argument currently to be processed */ char *ptr_command_text = &command_text[0]; /* reset the client */ memset(¶meter, 0, sizeof(parameter)); reset_client(¶meter); /* show version / build information */ #ifdef VSIB_REALTIME fprintf(stderr, "Tsunami Realtime Client for protocol rev %X\nRevision: %s\nCompiled: %s %s\n" " /dev/vsib VSIB accesses mode is %d, gigabit=%d, 1pps embed=%d, sample skip=%d\n", PROTOCOL_REVISION, TSUNAMI_CVS_BUILDNR, __DATE__ , __TIME__, vsib_mode, vsib_mode_gigabit, vsib_mode_embed_1pps_markers, vsib_mode_skip_samples); #else fprintf(stderr, "Tsunami Client for protocol rev %X\nRevision: %s\nCompiled: %s %s\n", PROTOCOL_REVISION, TSUNAMI_CVS_BUILDNR, __DATE__ , __TIME__); #endif /* while the command loop is still running */ while (1) { /* retrieve the user's commands */ if (argc<=1 || argc_curr>=argc) { /* present the prompt */ fprintf(stdout, "tsunami> "); fflush(stdout); /* read next command */ if (fgets(command_text, MAX_COMMAND_LENGTH, stdin) == NULL) { error("Could not read command input"); } } else { // severe TODO: check that command_text appends do not over flow MAX_COMMAND_LENGTH... /* assemble next command from command line arguments */ for ( ; argc_curr<argc; argc_curr++) { // zero argument commands if (!strcasecmp(argv[argc_curr], "close") || !strcasecmp(argv[argc_curr], "quit") || !strcasecmp(argv[argc_curr], "exit") || !strcasecmp(argv[argc_curr], "bye") || !strcasecmp(argv[argc_curr], "help") || !strcasecmp(argv[argc_curr], "dir")) { strcpy(command_text, argv[argc_curr]); argc_curr += 1; break; } // single argument commands if (!strcasecmp(argv[argc_curr], "connect")) { if (argc_curr+1 < argc) { strcpy(ptr_command_text, argv[argc_curr]); strcat(command_text, " "); strcat(command_text, argv[argc_curr+1]); } else { fprintf(stderr, "Connect: no host specified\n"); exit(1); } argc_curr += 2; break; } /*__FINAL_PROJECT_START__ if (!strcasecmp(argv[argc_curr], "connect6")) { if (argc_curr+1 < argc) { strcpy(ptr_command_text, argv[argc_curr]); strcat(command_text, " "); strcat(command_text, argv[argc_curr+1]); } else { fprintf(stderr, "Connect: no host specified\n"); exit(1); } argc_curr += 2; break; } __FINAL_PROJECT_END __*/ if (!strcasecmp(argv[argc_curr], "get")) { if (argc_curr+1 < argc) { strcpy(ptr_command_text, argv[argc_curr]); strcat(command_text, " "); strcat(command_text, argv[argc_curr+1]); } else { fprintf(stderr, "Get: no file specified\n"); exit(1); } argc_curr += 2; break; } // double argument commands if (!strcasecmp(argv[argc_curr], "set")) { if (argc_curr+2 < argc) { strcpy(ptr_command_text, argv[argc_curr]); strcat(command_text, " "); strcat(command_text, argv[argc_curr+1]); strcat(command_text, " "); strcat(command_text, argv[argc_curr+2]); } else { fprintf(stderr, "Connect: no host specified\n"); exit(1); } argc_curr += 3; break; } // unknown commands, skip fprintf(stderr, "Unsupported command console command: %s\n", argv[argc_curr]); } } /* parse the command */ parse_command(&command, command_text); /* make sure we have at least one word */ if (command.count == 0) continue; /* dispatch on the command type */ if (!strcasecmp(command.text[0], "close")) command_close (&command, session); else if (!strcasecmp(command.text[0], "connect")) session = command_connect(&command, ¶meter); //else if (!strcasecmp(command.text[0], "connect6")) session = command_connect6(&command, ¶meter); else if (!strcasecmp(command.text[0], "get")) command_get (&command, session); else if (!strcasecmp(command.text[0], "dir")) command_dir (&command, session); else if (!strcasecmp(command.text[0], "help")) command_help (&command, session); else if (!strcasecmp(command.text[0], "quit")) command_quit (&command, session); else if (!strcasecmp(command.text[0], "exit")) command_quit (&command, session); else if (!strcasecmp(command.text[0], "bye")) command_quit (&command, session); else if (!strcasecmp(command.text[0], "set")) command_set (&command, ¶meter); else fprintf(stderr, "Unrecognized command: '%s'. Use 'HELP' for help.\n\n", command.text[0]); } /* if we're here, we shouldn't be */ return 1; }
int main () { FILE * fp = fopen("opcode.txt","r"); char input_str[MAX_LEN_INPUT], command[MAX_LEN_COMMAND], argv[3][MAX_LEN_INPUT], *mnemonic = (char *) calloc(LEN_MNEMONIC, sizeof(char)); int i, j, error_flag, comma_flag, linking_loader_flag = 0, idx_input_str, idx_argv, opcode, format; hist_list * new_hist_elem = NULL; history_head = (hist_list *) calloc(1, sizeof(hist_list)); /* make opcode table */ for (i = 0; i < 20; i++) { table_head[i] = (op_list *) calloc(1, sizeof(op_list)); } // opcode에 관한 정보를 받고 linked list에 저장한다. i = 0; while (i < NUM_OF_OPCODES) { fscanf(fp, "%02X %s %d/%*s\n", &opcode, mnemonic, &format); // TODO : opcode table에서 linking 시켜 op_list 를 굳이 새로 만들지 않게 할 것 && 이 부분도 함수로 moduling 할 것 && trash -> format && mnemonic 바로 받는 것도 생각해 보기 make_linking_table(&table_head[hash_func(mnemonic)], opcode, mnemonic, format); opcode_table[i].opcode = opcode; opcode_table[i].format = format; strcpy(opcode_table[i].mnemonic, mnemonic); i ++; } while (1) { /**************************************/ /********** initialization ************/ /**************************************/ error_flag = 0; comma_flag = 0; idx_input_str = 0; linking_loader_flag = 0; for (i = 0; i < MAX_LEN_COMMAND; i++) { command[i] = 0; } for (i = 0; i < 3; i++) { for (j = 0; j < MAX_LEN_INPUT; j++) { argv[i][j] = 0; } } for (i = 0; i < MAX_LEN_INPUT; i++) { input_str[i] = 0; } /********** initialization end ********/ printf("sicsim> "); /**************************************/ /****** input string handling *********/ /**************************************/ gets(input_str); /** get command name **/ while (input_str[idx_input_str] == ' ') { idx_input_str ++; } /* ignore front space */ // input consists of space, enter if (!input_str[idx_input_str]) { continue; } idx_argv = 0; while ((input_str[idx_input_str] != ' ' && input_str[idx_input_str] != '\t') && (input_str[idx_input_str] != 0)) { command[idx_argv++] = input_str[idx_input_str++]; } command[idx_argv] = 0; while (input_str[idx_input_str] == ' ' || input_str[idx_input_str] == '\t' || input_str[idx_input_str] == '\n') { idx_input_str++; } /* ---------- linking loader check and execute command ---------- */ if (!strcmp(command, "progaddr")) { error_flag = linking_loader_main(1, input_str + idx_input_str); linking_loader_flag = 1; } else if (!strcmp(command, "loader")) { error_flag = linking_loader_main(2, input_str + idx_input_str); linking_loader_flag = 1; } else if (!strcmp(command, "run")) { error_flag = linking_loader_main(3, input_str + idx_input_str); linking_loader_flag = 1; } else if (!strcmp(command, "bp")) { error_flag = linking_loader_main(4, input_str + idx_input_str); linking_loader_flag = 1; } if (error_flag) { continue; } /* ---------- linking loader check end --------- */ if (!linking_loader_flag) { /* get parameter name */ for (i = 0; i < 3 ;i++) { comma_flag = 0; /** i th(second, third, fourth) argument value **/ if (input_str[idx_input_str]) { // not end /* ignore front space and counting comma */ while (input_str[idx_input_str] == ' ' || input_str[idx_input_str] == ',') { if (input_str[idx_input_str] == ',') { comma_flag++; } idx_input_str ++; } error_flag = error_check_comma(i, comma_flag); idx_argv = 0; while (input_str[idx_input_str] != ' ' && (input_str[idx_input_str] != 0) && (input_str[idx_input_str] != ',') && input_str[idx_input_str] != '\n') { // except 0(end of string), ",", space argv[i][idx_argv++] = input_str[idx_input_str++]; } argv[i][idx_argv] = 0; } } /* error checking */ if (error_flag) { SEND_ERROR_MESSAGE("COMMA"); continue; } else if(error_check_moreargv(input_str, idx_input_str)) { SEND_ERROR_MESSAGE("OVERFULL ARGV"); continue; } } /****** input string handling end ********/ /*****************************************/ /*********** execute command *************/ /*****************************************/ if (!strcmp(command, "help") || !strcmp(command, "h")) { // argv[0] exist - error if (argv[0][0]) { SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } command_help(); } else if (!strcmp(command, "dir") || !strcmp(command, "d")) { // argv[0] exist - error if (argv[0][0]) { SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } command_dir(); } else if (!strcmp(command, "quit") || !strcmp(command, "q")) { // argv[0] exist - error if (argv[0][0]) { SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } break; } else if (!strcmp(command, "history") || !strcmp(command, "hi")) { // argv[0] exist - error if (argv[0][0]) { SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } // function check } else if (!strcmp(command, "dump") || !strcmp(command, "du")) { // exception handling - boundary error and existing thrid argv int start = strtoi(argv[0], &error_flag, 16), end = strtoi(argv[1], &error_flag, 16); /* error handling */ if (error_flag) { // does not integer SEND_ERROR_MESSAGE("NOT INTEGER"); continue; } if ((start < 0) || (end < 0) || (start > 0xFFFFF) || (argv[1][0] && (start > end)) || start > 0xFFFFF || end > 0xFFFFF) { // boundary error SEND_ERROR_MESSAGE("BOUNDARY ERROR"); continue; } if (argv[2][0]) { // argv[2] exists SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } // params don't exist if (!argv[0][0]) { start = -1; } else if (!argv[1][0]) { end = -1; } command_dump(start, end); } else if (!strcmp(command, "edit") || !strcmp(command, "e")) { int addr = strtoi(argv[0], &error_flag, 16), val = strtoi(argv[1], &error_flag, 16); /* error handling */ if (error_flag) { // does not integer SEND_ERROR_MESSAGE("NOT INTEGER"); continue; } if (addr < 0x0 || addr > 0xFFFFF || val < 0 || val > 0xFF) { // boundary error SEND_ERROR_MESSAGE("BOUNDARY ERROR"); continue; } if (!argv[0][0] || !argv[1][0] || argv[2][0]) { // argv[0] doesn't exist || argv[1] doesn't exist || argv[2] exist SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } command_edit(addr, val); } else if (!strcmp(command, "fill") || !strcmp(command, "f")) { int start = strtoi(argv[0], &error_flag, 16), end = strtoi(argv[1], &error_flag, 16), val = strtoi(argv[2], &error_flag, 16); /* error handling */ if (error_flag) { // does not integer SEND_ERROR_MESSAGE("NOT INTEGER"); continue; } if ((start < 0) || (end < 0) || (start > 0xFFFFF)|| (argv[1][0] && (start > end)) || end > 0xFFFFF || val < 0 || val > 0xFF) { // boundary error SEND_ERROR_MESSAGE("BOUNDARY ERROR"); continue; } if (!argv[0][0] || !argv[1][0] || !argv[2][0]) { // argv[0] doesn't exist || argv[1] doesn't exist || argv[2] exist SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } command_fill(start, end, val); } else if (!strcmp(command, "reset")) { // argv[0] exist - error if (argv[0][0]) { SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } command_reset(); } else if (!strcmp(command, "opcode")) { char input_mnem[LEN_MNEMONIC]; // argv[0] exist - error if (!argv[0][0] || argv[1][0]) { SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } strcpy(input_mnem, argv[0]); command_opcode(input_mnem, &error_flag); if (error_flag == -1) { SEND_ERROR_MESSAGE("THERE IS NO MATCHING MNEMONIC"); continue; } } else if (!strcmp(command, "opcodelist")) { // argv[0] exist - error if (argv[0][0]) { SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } command_opcodelist(); } else if (!strcmp(command, "assemble")) { if (argv[1][0] || !argv[0][0]) { // argv[1][0] != 0 implies that second argument exists and argv[1][0] == 0 implies that first argument does not exist. SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } // TODO : Make a function deallocating a symbol_table if (!symbol_table) { // free symbol_table // FATAL it needs to be fixed. symbol_table = NULL; } if (strcmp(argv[0] + strlen(argv[0]) - 4, ".asm")) { SEND_ERROR_MESSAGE("THIS IS NOT .asm file"); } command_assemble(argv[0], &error_flag); if (error_flag) { continue; } } else if (!strcmp(command, "type")) { if (argv[1][0] || !argv[0][0]) { // argv[1][0] != 0 implies that second argument exists and argv[1][0] == 0 implies that first argument does not exist. SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } command_type(argv[0], &error_flag); if (error_flag) { // error is occured continue; } } else if (!strcmp(command, "symbol")) { // XXX : error check! if (argv[0][0]) { SEND_ERROR_MESSAGE("FORMAT DOES NOT MATCH THIS COMMAND"); continue; } if (!complete_table) { SEND_ERROR_MESSAGE("THERE IS NO SYMBOL TABLE"); continue; } command_symbol(); } else if (linking_loader_flag) {} else { SEND_ERROR_MESSAGE("THIS COMMAND DOES NOT EXIST"); continue; } hist_list * tmp_hist; // store in hist_list(linked list for history has command lines of history new_hist_elem = (hist_list *) calloc(1, sizeof(hist_list)); strcpy(new_hist_elem->command_line, input_str); tmp_hist = history_head; while (tmp_hist->next) { tmp_hist = tmp_hist->next; } tmp_hist->next = new_hist_elem; if (!strcmp(command, "history") || !strcmp(command, "hi")) { command_history(); } } fclose(fp); // deallocating memory deallocate_opcode(); deallocate_history(); return 0; }