/* * arg[0] = input uart settings * arg[1] = rx buff * arg[2] = path buff */ int console(int argc, char *argv[]) { //if(argc != 3 || !argv[0]) return; CONSOLE_STRUCT *settings; if(!argv[0]) { argv[0] = calloc(1, sizeof(CONSOLE_STRUCT)); settings = (CONSOLE_STRUCT *)argv[0]; settings->path = malloc(2); settings->rx_data = calloc(1, 1); strcpy(settings->path, "/"); //argv[2] = malloc(sizeof(char *)); } else { settings = (CONSOLE_STRUCT *)argv[0]; int rx_c = (int)argv[1]; argv[1] = NULL; if(rx_c >= 0) { char _a_[2]; _a_[0] = rx_c; _a_[1] = 0; if(rx_c != '\n' && rx_c != '\r') settings->rx_data = str_append(settings->rx_data, _a_); else { char *a = settings->rx_data; int a_len = 0; while((a_len = strlen(a)) != 0) { int app_list_cnt = sizeof(console_app_list) / sizeof(CONSOLE_APP_LIST); while(*a == ' ' && *a != 0) a++; if(*a == 0) break; while(--app_list_cnt >= 0 && memcmp(a, console_app_list[app_list_cnt].name, strlen(console_app_list[app_list_cnt].name)) != 0); if(app_list_cnt >= 0) { a += strlen(console_app_list[app_list_cnt].name); if(console_app_list[app_list_cnt].console == _cd) { CONSOLE_STERT_END_ARG arg_start_end; console_start_end_arg(&arg_start_end, a); int arg_len = (int)(arg_start_end.end - arg_start_end.start); char *argument = calloc(1, arg_len + 1); strncat(argument, arg_start_end.start, arg_len); a = arg_start_end.end; char *cd_arg[2]; cd_arg[0] = settings->path; cd_arg[1] = argument; char *cd_result = (char *)_cd(2, cd_arg); if(!memcmp(cd_result, "ERROR", 5)) UARTprintf(DebugCom, "%s" , cd_result); else { if(settings->path) free(settings->path); settings->path = cd_result; } UARTPuts(DebugCom, settings->path, -1); UARTPuts(DebugCom, "\n\r", -1); } else { CONSOLE_STERT_END_ARG arg_start_end; switch((int)console_app_list[app_list_cnt].order) { case(CONSOLE_LS): case(CONSOLE_CAT): settings->child_arg = calloc(1, sizeof(char **) * (console_app_list[app_list_cnt].arg_nr + 2)); settings->child_arg[0] = NULL; settings->child_arg[1] = settings->path; console_start_end_arg(&arg_start_end, a); int arg_nr_cnt = console_app_list[app_list_cnt].arg_nr; if(arg_nr_cnt) { /*char *argument = calloc(1, arg_len + 1); strncat(argument, arg_start_end.start, arg_len); a = arg_start_end.end; char *tmp_path; tmp_path = settings->path; char *tmp = calloc(1, strlen(tmp_path) + 1); strcpy(tmp, tmp_path); //tmp = str_copy(tmp_path[0]); tmp = path_append_parse(tmp, argument); settings->child_arg[1] = tmp;*/ while(console_start_end_arg(&arg_start_end, a) && arg_nr_cnt != 0) { int arg_len = (int)(arg_start_end.end - arg_start_end.start); settings->child_arg[console_app_list[app_list_cnt].arg_nr - arg_nr_cnt] = malloc(arg_len + 1); strncpy(settings->child_arg[console_app_list[app_list_cnt].arg_nr - arg_nr_cnt], arg_start_end.start ,arg_len); settings->child_arg[console_app_list[app_list_cnt].arg_nr - arg_nr_cnt][arg_len] = 0; arg_nr_cnt--; a = arg_start_end.end; } } /*if(console_app_list[app_list_cnt].arg_nr - console_app_list[app_list_cnt].res_args == console_app_list[app_list_cnt].arg_nr - arg_nr_cnt) {*/ settings->child_arg[0] = NULL; settings->child_arg_nr = console_app_list[app_list_cnt].arg_nr - arg_nr_cnt/*console_app_list[app_list_cnt].arg_nr*/; settings->app = console_app_list[app_list_cnt].console; settings->app_order = console_app_list[app_list_cnt].order; if(console_app_list[app_list_cnt].order == CONSOLE_CAT) { UARTPuts(DebugCom, settings->path, -1); UARTPuts(DebugCom, "\n\r", -1); } /*} else { if(console_app_list[app_list_cnt].arg_nr - console_app_list[app_list_cnt].res_args > console_app_list[app_list_cnt].arg_nr - arg_nr_cnt) { UARTPuts(DebugCom, console_app_list[app_list_cnt].help_many_args, -1); UARTPuts(DebugCom, "\n\r", -1); } else { UARTPuts(DebugCom, console_app_list[app_list_cnt].help_few_args, -1); UARTPuts(DebugCom, "\n\r", -1); } console_clear_child_data(settings); }*/ break; } } } else a++; } settings->rx_data = str_clear(settings->rx_data); } } if(settings->app) { char* result; if((result = (char *)settings->app(settings->child_arg_nr, settings->child_arg))) { switch((int)settings->app_order) { case(CONSOLE_LS): case(CONSOLE_CD): UARTprintf(DebugCom, "%s" , result); break; case(CONSOLE_CAT): if(!memcmp(result, "ERROR", 5)) UARTPuts(DebugCom, result, -1); else UARTPuts(DebugCom, result, (int)settings->child_arg[4]); break; } } else { if(settings->app == _ls) { UARTPuts(DebugCom, settings->path, -1); UARTPuts(DebugCom, "\n\r", -1); } console_clear_child_data(settings); } } } return 0; }
int main(int argc, char * argv[], char * env[]) { char line[128], command[128], pathname[128]; int ID; // DEVICE SELECT get_device(); // INITIALIZE init(); // MOUNT ROOT mount_root(); // PROCESS LOOP while(1) { strcpy(line, ""); strcpy(command, ""); strcpy(pathname, ""); strcpy(completePath, ""); printf("\n\ninput a command (type help for more info): "); //read a line containting command [pathname]; // [ ] means optional fgets(line, 256, stdin); line[strlen(line)-1] = '\0'; //Find the command string and call the corresponding function; parseString(line, arg1, command, pathname); compPath(pathname); printf("PATHNAME: %s\n", pathname); ID = findCommand(command); switch(ID) { case -1 : printDir(running->cwd->ino); break; case 0 : _menu (arg1, pathname); break; case 1 : _ls (arg1, pathname); break; case 2 : _cd (arg1, pathname); break; case 3 : _mkdir (arg1, pathname); break; case 4 : _rmdir (arg1, pathname); break; case 5 : _pwd (arg1, pathname); break; case 6 : _creat0(arg1, pathname); break; case 7 : _rm (arg1, pathname); break; case 8 : _stat (arg1, pathname); break; case 9 : compPath(arg1); _link(arg1, pathname); break; case 10: _unlink(arg1, pathname); break; case 11: compPath(arg1); _symlink(arg1, pathname); break; case 12: _touch (arg1, pathname); break; case 13: _chmod (arg1, pathname); break; case 14: _chown (arg1, pathname); break; case 15: _chgrp (arg1, pathname); break; case 16: _open (arg1, pathname); break; case 17: _close (arg1, pathname); break; case 18: _read (arg1, pathname); break; case 19: _write (arg1, pathname); break; case 20: _pfd (arg1, pathname); break; case 21: _lseek (arg1, pathname); break; case 22: _cat (arg1, pathname); break; case 23: _cp (arg1, pathname); break; case 24: _mv (arg1, pathname); break; case 25: __exit (arg1, pathname); break; } } quit(); return 0; }