⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simulate.c

📁 norflash的文件系统。 用于中低端手机开发的参考
💻 C
📖 第 1 页 / 共 4 页
字号:
}

int ExecuteCurrentCommand(char * buffer, int BufSize)
{

	char s[1024];
	char *p;
    int i,j,k;
    int pos[128];
    int value[128];
    static struct
    {
	uint8 * s;
	int (*f)(char z[],int pos[],int value[],int len);
    } a[]=
    {

	{"cls",		CMD_CLS},
	{"quit",	CMD_QUIT},
	{"ver",		CMD_VER},
	{"recl",	CMD_RECLTEST},
	{"copy",	CMD_COPY},
	{"dir",		CMD_DIR},
	{"type",	CMD_TYPE},
	{"reclaim",	CMD_RECLAIM},
	{"delete",	CMD_DELETE},
	{"mkdir",	CMD_MD},
	{"rmdir",	CMD_RD},
	{"help",	CMD_HELP},
	{"/?",		CMD_HELP},
	{"h",		CMD_HELP},
	{"volinfo",	CMD_GETFREESPACE},
	{"devshow",	CMD_MOUNTEDDEVSHOW},
	{"rename",	CMD_RENAME},
	{0,		0},
    };

	if(BufSize == 0)	return 0;

	p = buffer;
    memcpy(s,p,BufSize+1);
//    my_strupr(s);
    k=SplitLineBySpace(s,pos);
    if (k<1) return 0;

    for (i=1;i<k;i++) value[i]=my_atoi(s+pos[i]);
    j=strlen(s+pos[0])+1;
    for (i=0;a[i].s;i++)
    if (memcmp(a[i].s,s+pos[0],j)==0) return (*a[i].f)(s,pos,value,k);
    FsmPrintf("\r\nUnknown Command: %s",buffer);

	return 0;
}

int FsmGetCommand(char * s)
{
	uint32 ThreadId;
	int i;
	uint8 tmpbuf[16];
	int socket_id;
	int status;

	ThreadId = GetCurrentThreadId();
	for(i = 0; i < MAX_THREAD_NUM; i++)
	{
		if(ThreadId == system_data.TreadCtrl_t[i].ThreadID)
		{
			break;
		}
	}

	if(i == MAX_THREAD_NUM)
	{
		return 0;
	}
	if(system_data.TreadCtrl_t[i].ThreadType != THREADTYPE_SOCKET)
	{
		gets(s);
		return 0;
	}
	else
	{
		socket_id = system_data.TreadCtrl_t[i].SocketID;
		for(i = 0; i < 256; i++)
		{
LOOPT1:		while ((status = ReadStream(socket_id,s+i,1)) < 0)
			{
				Sleep(10*10);
			}
			if(status == 0)
			{
//				CloseSocket(socket_id);
//				memset(&system_data.TreadCtrl_t[i],0,sizeof(system_data.TreadCtrl_t[i]));
				return -1;
			}
			if(*(s+i) == 0x08)	//Back
			{
				if(i == 0)
				{
					*(s+i) = 0;
					i -= 1;
					goto LOOP2;
			//		continue;
			//		goto LOOPT;
				}
				else
				{
					*(s+i-1) = 0;
					*(s+i) = 0;
					i -= 2;
					tmpbuf[0] = 0x08;
					tmpbuf[1] = ' ';
					tmpbuf[2] = 0x08;
					SendStream(socket_id,tmpbuf,3);
				//	continue;
					goto LOOP2;
				}
			}
			if(*(s+i) == _KEY_ESC)
				continue;
			if((*(s+i) >= 'A') && (*(s+i) <= 'D') && (*(s+i-1) == 'O') && (*(s+i-2) == _KEY_ESC))
			{
				*(s+i) = 0;
				*(s+i-1) = 0;
				*(s+i-2) = 0;
				i -= 3;
				continue;
			}
				
			if((*(s+i) >= '0') && (*(s+i) <= '9'))
			//	continue;
				goto LOOP2;
			if((*(s+i) >= 'a') && (*(s+i) <= 'z'))
			//	continue;
				goto LOOP2;
			if((*(s+i) >= 'A') && (*(s+i) <= 'Z'))
			//	continue;
				goto LOOP2;
/*
			switch(*(s + i))
			{
			case ' ':
			case '*':
			case '\\':
			case '/':
			case '?':
			case '.':
				goto LOOP2;
			case '\r':
				continue;
			case '\n':
				if(*(s+i-1) == '\r')
				{
					break;
				}
			default:
				goto LOOPT1;
			}
*/	
			if((*(s+i) == ' ') || (*(s+i) == '*') || (*(s+i) == '.'))
			//	continue;
				goto LOOP2;
			if((*(s+i) == '\\') || (*(s+i) == '/') || (*(s+i) == '?'))
			//	continue;
				goto LOOP2;
			if((*(s+i) == '\r'))
				continue;
			//	goto LOOP2;
			if((*(s+i) == '\n') && (*(s+i-1) == '\r'))
				break;
			goto LOOPT1;
			//strcpy(s+ i, "\r\n");
		//break;
LOOP2:		{
				strcpy(tmpbuf,"\rFSMDEBUG>");
				SendStream(socket_id,tmpbuf,strlen(tmpbuf));
				SendStream(socket_id,s,strlen(s));
			}
		}
	}
	return 0;

}

#if 0
int FsmGetCommand(char * s)
{
	uint32 ThreadId;
	int i;
	uint8 tmpbuf[16];
	int socket_id;
	int status;

	ThreadId = GetCurrentThreadId();
	for(i = 0; i < MAX_THREAD_NUM; i++)
	{
		if(ThreadId == system_data.TreadCtrl_t[i].ThreadID)
		{
			break;
		}
	}

	if(i == MAX_THREAD_NUM)
	{
		return 0;
	}
	if(system_data.TreadCtrl_t[i].ThreadType != THREADTYPE_SOCKET)
	{
		gets(s);
		return 0;
	}
	else
	{
		socket_id = system_data.TreadCtrl_t[i].SocketID;
		for(i = 0; i < 256; i++)
		{
LOOPT1:		while ((status = ReadStream(socket_id,s+i,1)) < 0)
			{
				Sleep(10*10);
			}
			if(status == 0)
			{
//				CloseSocket(socket_id);
//				memset(&system_data.TreadCtrl_t[i],0,sizeof(system_data.TreadCtrl_t[i]));
				return -1;
			}
			if(*(s+i) == 0x08)	//Back
			{
				if(i == 0)
				{
					*(s+i) = 0;
					i -= 1;
					goto LOOP2;
			//		continue;
			//		goto LOOPT;
				}
				else
				{
					*(s+i-1) = 0;
					*(s+i) = 0;
					i -= 2;
					tmpbuf[0] = 0x08;
					tmpbuf[1] = ' ';
					tmpbuf[2] = 0x08;
					SendStream(socket_id,tmpbuf,3);
				//	continue;
					goto LOOP2;
				}
			}

			if((*(s+i) >= '0') && (*(s+i) <= '9'))
			//	continue;
				goto LOOP2;
			if((*(s+i) >= 'a') && (*(s+i) <= 'z'))
			//	continue;
				goto LOOP2;
			if((*(s+i) >= 'A') && (*(s+i) <= 'Z'))
			//	continue;
				goto LOOP2;
			if((*(s+i) == ' ') || (*(s+i) == '*'))
			//	continue;
				goto LOOP2;
			if((*(s+i) == '\\') || (*(s+i) == '/') || (*(s+i) == '?'))
			//	continue;
				goto LOOP2;
			if((*(s+i) == '\r') || (*(s+i) == '.'))
				continue;
			//	goto LOOP2;
			if((*(s+i) == '\n') && (*(s+i-1) == '\r'))
				break;
			goto LOOPT1;
			//strcpy(s+ i, "\r\n");
			//break;
LOOP2:		{
				strcpy(tmpbuf,"\rFSMDEBUG>");
				SendStream(socket_id,tmpbuf,strlen(tmpbuf));
				SendStream(socket_id,s,strlen(s));
			}
		}
	}
	return 0;

}
#endif

//----------------------------------------------------------------
//	一边进行人机对话一边进行交换工作
//----------------------------------------------------------------
int StartWorking()
{
    char s[1024];
    int  len;
//	HANDLE ThreadHandle;
	uint32 ThreadID;

    len=0;
	memset(s,0,sizeof(s));
//	ThreadHandle = GetCurrentThread();
	ThreadID = GetCurrentThreadId();
	do
    {
//		NetClientConnectScan();
	    FsmPrintf("\r\nFSMDEBUG>");
//		len = scanf("%s",s);//Why can not scan Enter
//		gets(s);
		if (FsmGetCommand(s) == -1)
		{
			return 0;
		}
//		gets(s);
		len = strlen(s);
		if (len<0) break;
		if (ExecuteCurrentCommand(s,len)<0) break;
		memset(s,0,sizeof(s));
    } while (system_data.QuitMode==0);
    return 0;
}
//-----------------------------------------------------
//	为退出系统作准备
//-----------------------------------------------------
int QuitFromSystem()
{
     return 0;
}
//-----------------------------------------------------
//	主程序开始
//-----------------------------------------------------
#ifdef WIN95_O
int main()
{
    char heap_area[FLASH_SIZE];

	InitializeSystem((int)heap_area,FLASH_SIZE);	// 系统初始化
	PhyDelaySomeTime(100);			    
//	FSMInitReclaimTask();
	StartWorking();					// 开始工作
	QuitFromSystem();

    return 0;
}
#endif

int Send2IOBuffer(int SocketID, uint8 c)
{
	uint8 buf[8];
	buf[0] = c;
	return SendStream(SocketID,buf,1);
}
static int DisplayNearBlock(int SocketID,char * near_s,int block_length)
{
    int i;

    for (i=0;i<block_length;i++)
	{
		Send2IOBuffer(SocketID,near_s[i]);
	}
    return 0;
}

static int display_near_string(int SocketID,char * s,int plus_flag,int minus_flag,int width)
{
    int  len;
    int  i;
    uint8 c;

    if (s==0) return 0;		
    for (len=0;s[len];len++);
	
    if (minus_flag==0)
	{
		for (i=len;i<width;i++)
		{
			Send2IOBuffer(SocketID,' ');
		}
		while ((c=*s++)!=0)
		{
			Send2IOBuffer(SocketID,c);
		}
	}
	else
		for (i=len;i<width;i++)
		{
			Send2IOBuffer(SocketID,' ');
		}
		return 0;
}

static int display_number(int SocketID,int value,int zero_flag,int unsigned_flag,
	int plus_flag,int minus_flag,int width,int radix,int uppercase)
{
    unsigned int x,y;
    char     buf[512];
    int      sign_flag,i,j,k;
	
    sign_flag = 0;
    if(unsigned_flag==0 && value<0)
    {
		sign_flag = 1;
		x = -value;
    }
    else
		x = value;
	
    i = 0;
    while (x>0)
    {
		y = x/radix;
		k = x%radix;
		buf[i++]=tab[k];
		x = y;
    }
	
    if (uppercase==0)
		for (j=0;j<i;j++)
			if (buf[j]>='A' && buf[j]<='Z') buf[j] += 'a'-'A';
			
			if (i==0)
				buf[i++] = '0';
			
			k = (sign_flag==0) ? width - i : width-i-1;
			
			if (minus_flag==0)
			{
				if (zero_flag)
				{
					if (sign_flag) Send2IOBuffer(SocketID,'-');
					for (j=0;j<k;j++) Send2IOBuffer(SocketID,'0');
				}
				else
				{
					for (j=0;j<k;j++) Send2IOBuffer(SocketID,' ');
					if (sign_flag) Send2IOBuffer(SocketID,'-');
				}
				for (j=i-1;j>=0;j--) Send2IOBuffer(SocketID,buf[j]);
				return 0;
			}
			if (sign_flag) Send2IOBuffer(SocketID,'-');
			if (zero_flag)
			{
				for (j=0;j<k;j++) Send2IOBuffer(SocketID,'0');
				for (j=i-1;j>=0;j--) Send2IOBuffer(SocketID,buf[j]);
			}
			else
			{
				for (j=i-1;j>=0;j--) Send2IOBuffer(SocketID,buf[j]);
				for (j=0;j<k;j++) Send2IOBuffer(SocketID,' ');
			}
			return 0;
}
int VirtualPrint(const char * format, int SocketID)
{
	uint8 c;
	int width;
	char * near_s;
	int zero_flag;
	int unsigned_flag;
    int plus_flag;
    int minus_flag;
	int loop;
	int * p;
	int short_value;
    int block_length;

	p = ((int *)&format)+1;

	for (;;)
    {
		c=*format++;
		if (c==0) return 0;
		if (c!=(unsigned char)'%')
L1:		{
			Send2IOBuffer(SocketID,c);
			continue;
		}
		width = 0;
		unsigned_flag = 0;
		plus_flag = 0;
		minus_flag = 0;
		zero_flag = 0;
		loop = 1;
		while (loop)
		{
			c=*format++;
			switch(c)
			{
			case   0:	return 0;
			case '%':	goto L1;
				
			case '0':	if (width==0) zero_flag = 1;
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':	width = width*10 + c-'0';
				continue;
			case 'F':
			case 'f':	continue;
			case '+':	plus_flag =1;
				continue;
			case '-':	minus_flag = 1;
				continue;
			case 'u':
			case 'U':	unsigned_flag = 1;
				continue;
			case 'l':
			case 'L':
				continue;
			case 's':
			case 'S':
				(int)near_s = *p++;
				display_near_string(0,near_s,plus_flag,minus_flag,width);
				loop = 0;
				break;
			case 't':
			case 'T':
				block_length=*p++;
				(int)near_s=*p++;
				DisplayNearBlock(0,near_s,block_length);
				break;
			case 'd':
			case 'D':
			case 'x':
			case 'X':
			case 'b':
			case 'B':
				short_value = *p++;
				display_number(0,short_value,
					zero_flag,
					unsigned_flag,plus_flag,
					minus_flag,width,
					(c=='d' || c=='D') ? 10 : (c=='x' || c=='X') ? 16 : 2,
					(c=='x') ? 0 : 1);
				loop = 0;
				break;
			case 'c':
			case 'C':	Send2IOBuffer(SocketID,(char)(*p++));
			default:	loop = 0;
				break;
			}
		}
    }
	return 0;
}

int FsmPrintf(const char * format, ...)
{
	uint32 ThreadID;
	int i;
	int socket_id;
	va_list argList;
	uint8 buf[1024];

	va_start(argList, format);
	ThreadID = GetCurrentThreadId();
	for(i = 0; i < MAX_THREAD_NUM; i++)
	{
		if(ThreadID == system_data.TreadCtrl_t[i].ThreadID)
		{
			break;
		}
	}

	if(i == MAX_THREAD_NUM)
	{
		return 0;
	}

	vsprintf(buf,format,argList);
	if(system_data.TreadCtrl_t[i].ThreadType != THREADTYPE_SOCKET)
	{
		return printf("%s",buf);
	}
	else
	{
		socket_id = system_data.TreadCtrl_t[i].SocketID;
		return SendStream(socket_id, buf, strlen(buf));
//		return VirtualPrint(format,system_data.TreadCtrl_t[i].SocketID);
	}
	return 0;
}

int MainInit(void)
{
	uint32 ThreadID;

	memset(&system_data,0,sizeof(system_data));
	memset(&SimFd_t,0,sizeof(SimFd_t));
	ThreadID = GetCurrentThreadId();
	system_data.TreadCtrl_t[0].IsUsed = 1;
	system_data.TreadCtrl_t[0].ThreadID = ThreadID;
	system_data.TreadCtrl_t[0].SocketID = 0;
	system_data.TreadCtrl_t[0].ThreadType = 0;

	FsmNetServerInit(1024);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -