示例#1
0
//色付文字を出力
DWORD Console::outputString(int foreground,int background,const TCHAR* fmt,...){
	DWORD written_chars=0;

	if(fmt==NULL)return written_chars;

	int orig_colors=getColors();

	if(!isRedirected()){
		//色設定を変更する
		if(foreground!=NONE)setFGColor(foreground);
		if(background!=NONE)setBGColor(background);
	}

	va_list argp;
	va_start(argp,fmt);

	write(fmt,argp,&written_chars);

	va_end(argp);

	if(!isRedirected()){
		//色設定を元に戻す
		setColors(orig_colors);
	}
	return written_chars;
}
示例#2
0
文件: main.c 项目: ErikPshat/cxmb
int IoClose_new( PspIoDrvFileArg * arg )
{
	PspIoDrvArg * drv = arg->drv;
	int num = isRedirected( arg );
	if( num >= 0 && arg->fs_num == 0 )
	{
		arg->drv = ms_drv;
		handler_count --;
		memcpy( &ctf_handler[num], &ctf_handler[num + 1], sizeof( CtfHandler ) * ( handler_count - num ) );
		int ret = fatms_drv->funcs->IoClose( arg );
		arg->drv = drv;
		return ret;
	}
	if ( arg->arg == t_record )
	{
		log( "write finished!\n" );
		int fd = sceIoOpen( CXMB_CONF_FILE, PSP_O_RDWR | PSP_O_CREAT | PSP_O_TRUNC, 0777 );
		if ( fd < 0 )
		{
			log( "failed in openning %s\n", CXMB_CONF_FILE );
		}
		else
		{
			sceIoWrite( fd, selected_theme_file, strlen( selected_theme_file ) + 1 );
			sceIoClose( fd );
		}
		IoClose( arg );
		sceKernelSignalSema( sema, 1 );
	}
	arg->drv = drv;
	int ret = IoClose(arg);
	return ret;
}
示例#3
0
文件: main.c 项目: ErikPshat/cxmb
int IoIoctl_new( PspIoDrvFileArg * arg, unsigned int cmd, void * indata, int inlen, void * outdata, int outlen )
{
	PspIoDrvArg * drv = arg->drv;
	int num = isRedirected( arg );
	if( num >= 0 && arg->fs_num == 0 )
	{
		arg->drv = ms_drv;
		int ret = fatms_drv->funcs->IoIoctl( arg, cmd, indata, inlen, outdata, outlen );
		if ( ret < 0 )
		{
			log( "error: %08x when ioctl cmd %08x %s\n", ret, cmd, ctf_header[ctf_handler[num].num].name );
			/*arg->drv = drv;
			ret = IoReopen( arg, num );
			if ( ret < 0 )
			{
				char name[128];
				strcpy( name, ctf_header[ctf_handler[num].num].name );
				uninstall_cxmb();
				if( ret != -2 )
					lflash_drv->funcs->IoOpen( arg, name, PSP_O_RDONLY, 0644 );
				return IoIoctl( arg, cmd, indata, inlen, outdata, outlen );
			}
			num = handler_count - 1;
			ret = fatms_drv->funcs->IoIoctl( arg, cmd, indata, inlen, outdata, outlen );*/
		}
		arg->drv = drv;
		return ret;
	}
	int ret =  IoIoctl( arg, cmd, indata, inlen, outdata, outlen );
	return ret;
}
示例#4
0
文件: main.c 项目: ErikPshat/cxmb
int IoRead_new( PspIoDrvFileArg * arg, char * data, int len )
{
	PspIoDrvArg * drv = arg->drv;
	int num = isRedirected( arg );
	if( num >= 0 && arg->fs_num == 0 )
	{
		arg->drv = ms_drv;
		int ret = fatms_drv->funcs->IoLseek( arg, 0, PSP_SEEK_CUR );
		if ( ret < 0 )
		{
			log( "error: %08x when read %s\n", ret, ctf_header[ctf_handler[num].num].name );
			arg->drv = drv;
			ret = IoReopen( arg, &num );
			if ( ret < 0 )
			{
				return ret;
			}
		}
		int sub = ret + len - ctf_header[ctf_handler[num].num].start - ctf_header[ctf_handler[num].num].size;
		if ( sub <= 0 )
		{
			sub = 0;
		}
		ret =  fatms_drv->funcs->IoRead( arg, data, len - sub );
		ctf_handler[num].offset += ret;
		arg->drv = drv;
		return ret;
	}
	int ret = IoRead( arg, data, len );
	return ret;
}
示例#5
0
//文字を読み込む
bool Console::read(VOID* buffer,DWORD buffer_size,LPDWORD read_chars){
	bool result=false;
	DWORD read=0;

	if(isRedirected()){
		result=::ReadFile(m_handle,buffer,buffer_size,&read,NULL)!=0;
		if(read_chars)*read_chars=read/sizeof(TCHAR);
	}else{
		//TODO:大きなバッファサイズの文字列の読み込み
		result=::ReadConsole(m_handle,buffer,buffer_size,&read,NULL)!=0;
		if(read_chars)*read_chars=read;
	}
	return result;
}
示例#6
0
//文字を書き込む
bool Console::write(const VOID* buffer,DWORD buffer_size,LPDWORD written_chars){
	bool result=false;
	DWORD written=0;

	if(isRedirected()){
		tstring buffer_str((const TCHAR*)buffer);
		str::replaceString(buffer_str,_T("\n"),_T("\r\n"));
#ifdef UNICODE
		if(isAnsiMode()){
			std::string ansi=str::utf162sjis(buffer_str);
			result=::WriteFile(m_handle,ansi.c_str(),ansi.length()*sizeof(char),&written,NULL)!=0;
		}else
#endif
		result=::WriteFile(m_handle,buffer_str.c_str(),buffer_str.length()*sizeof(TCHAR),&written,NULL)!=0;
		if(written_chars)*written_chars=written/sizeof(TCHAR);
	}else{
		//バッファサイズが大き過ぎる場合出力されない
//		result=::WriteConsole(m_handle,buffer,buffer_size,&written,NULL);

		//分割して出力
#ifdef UNICODE
		if(!isAnsiMode()){
#endif
			const TCHAR* ptr=static_cast<const TCHAR*>(buffer);
			const TCHAR* end=ptr+lstrlen(static_cast<const TCHAR*>(buffer));

			for(DWORD write_size=io_buffer_size;ptr<end;ptr+=written){
				if(write_size>static_cast<DWORD>(end-ptr))write_size=end-ptr;

				result=::WriteConsole(m_handle,ptr,write_size,&written,NULL)!=0;
			}
			if(written_chars)*written_chars=ptr-(const TCHAR*)buffer;
#ifdef UNICODE
		}else{
			std::string ansi=str::utf162sjis(static_cast<const wchar_t*>(buffer));
			const char* ptr=ansi.c_str();
			const char* end=ptr+lstrlenA(ansi.c_str());

			for(DWORD write_size=io_buffer_size;ptr<end;ptr+=written){
				if(write_size>static_cast<DWORD>(end-ptr))write_size=end-ptr;

				result=::WriteConsoleA(m_handle,ptr,write_size,&written,NULL)!=0;
			}
			if(written_chars)*written_chars=ptr-ansi.c_str();
		}
#endif
	}
	return result;
}
示例#7
0
文件: sh3_3.c 项目: huaguang/OS_CD
void getComNumAndRedirectedPos(char **args,int *pComNum,int*pRedirectedPos){
	int i;
	int pos=0;
	short totalLen=0;
	short comLen=0;
	*pRedirectedPos=0;
	for(i=0;i<*pComNum;i++){
		pos=isRedirected(args+totalLen,&comLen);
		if(pos!=0){
			*pComNum=i+1;
			*pRedirectedPos=pos;
			return;
		}
		totalLen+=comLen;
	}

}
示例#8
0
文件: main.c 项目: ErikPshat/cxmb
SceOff IoLseek_new( PspIoDrvFileArg * arg, SceOff ofs, int whence )
{
	PspIoDrvArg * drv = arg->drv;
	int num = isRedirected( arg );
	if( num >= 0 && arg->fs_num == 0 )
	{
		arg->drv = ms_drv;
		int ret = fatms_drv->funcs->IoLseek( arg, 0, PSP_SEEK_CUR );
		if ( ret < 0 )
		{
			log( "error: %08x when seek %s\n", ret, ctf_header[ctf_handler[num].num].name );
			arg->drv = drv;
			ret = IoReopen( arg, &num );
			if ( ret < 0 )
			{
				return ret;
			}
		}
		switch ( whence )
		{
			case PSP_SEEK_SET:
				fatms_drv->funcs->IoLseek( arg, ctf_header[ctf_handler[num].num].start, PSP_SEEK_SET );
				break;
			case PSP_SEEK_END:
				fatms_drv->funcs->IoLseek( arg, ctf_header[ctf_handler[num].num].start + ctf_header[ctf_handler[num].num].size, PSP_SEEK_SET );
				break;
		}
		ret = fatms_drv->funcs->IoLseek( arg, ofs, PSP_SEEK_CUR );
		if ( ret < ctf_header[ctf_handler[num].num].start )
		{
			ret = fatms_drv->funcs->IoLseek( arg, ctf_header[ctf_handler[num].num].start, PSP_SEEK_SET );
		}
		else if ( ret > ( ctf_header[ctf_handler[num].num].start + ctf_header[ctf_handler[num].num].size ) )
		{
			ret = fatms_drv->funcs->IoLseek( arg, ctf_header[ctf_handler[num].num].start + ctf_header[ctf_handler[num].num].size, PSP_SEEK_SET );
		}
		ctf_handler[num].offset = ret;
		ret -= ctf_header[ctf_handler[num].num].start;
		arg->drv = drv;
		return ret;
	}
	int ret =  IoLseek( arg, ofs, whence );
	return ret;
}
示例#9
0
文件: main.c 项目: ErikPshat/cxmb
int IoReopen( PspIoDrvFileArg * arg, int * num )
{
	unsigned int sig = 0;
	int err = 0;
	CtfHandler tmp;
	memcpy( &tmp, &ctf_handler[*num], sizeof( CtfHandler ) );
	int fd = -1, i = 0;
	for ( i = 0; fd < 0 && i < 10; i ++ )
	{
		sceKernelDelayThread( 100000 );
		fd = sceIoOpen( cxmb_theme_file, PSP_O_RDONLY, 0644 );
	}
	if ( fd >= 0 )
	{
		sceIoLseek( fd, 8, PSP_SEEK_SET );
		sceIoRead( fd, &sig, 4 );
		sceIoClose( fd );
		if ( sig == ctf_sig )
		{
			*num = isRedirected( arg );
			if ( *num >= 0 && ctf_handler[*num].num == tmp.num )
			{
				lflash_drv->funcs->IoClose( arg );
				lflash_drv->funcs->IoOpen( arg, ctf_header[tmp.num].name, PSP_O_RDONLY, 0644 );
				ctf_handler[*num].offset = tmp.offset;
				arg->drv = ms_drv;
				int ret = fatms_drv->funcs->IoLseek( arg, ctf_handler[*num].offset, PSP_SEEK_SET );
				if ( ret >= 0 )
				{
					return ret;
				}
				else
				{
					log( "failed in seek the reopen file!\noffset: %08x\n, ret: %08x\n", tmp.offset, ret );
					uninstall_cxmb();
					return ret;
				}
			}
			else
			{
				log( "failed in reopen ctf theme file!\n" );
				err = -2;
			}
		}
		else
		{
			log( "ctf theme file changed!\nori %08x now: %08x\n", ctf_sig, sig );
			err = -3;
		}
	}
	else
	{
		log( "ctf theme file removed!\n" );
		err = -4;
	}
	lflash_drv->funcs->IoClose( arg );
	uninstall_cxmb();
	lflash_drv->funcs->IoOpen( arg, ctf_header[tmp.num].name, PSP_O_RDONLY, 0644 );
	log( "uninstalled!\n" );
	return err;
}