예제 #1
0
/*
 * 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;
}
예제 #2
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;
}