📄 haishell.c
字号:
/*
;---------------------------------------------------------------------------------
; Copyright (c) Haisoft 2008-10-27
; Author: Kingsea
; Email: jinhailiao@163.com
;-------------------------------------------------------------
; Project: HaiBios
; File: haishell.c
; Description:
;-------------------------------------------------------------
; Reversion Histroy:
;-------------------------------------------------------------
; Version date operations by who
; 1.0.0 2008-10-27 Create Kingsea
;
;---------------------------------------------------------------------------------
*/
#include "haitype.h"
#include "hfileapi.h"
#include "haiclib.h"
#include "haibios.h"
#include "uart2410.h"
#ifdef HAIBIOSSIM
#include "stdio.h"
#define hai_printf printf
#define hai_scanf scanf
#endif
#define TEST_LOAD_FILE
int listdir(void)
{
int err;
long handle;
struct finddata fd;
handle = hai_findfirst("", &fd);
if (!handle)
{
hai_printf("not find!\n");
return -1;
}
do {
if (fd.attrib&0x10)
hai_printf("d ");
else
hai_printf("f ");
hai_printf(fd.name); hai_printf("\n");
err = hai_findnext(handle, &fd);
}while (!err);
hai_findclose(handle);
return 0;
}
char *cmdset[] =
{
"exit",
"format",
"chdir",
"mkdir",
"rmdir",
"flush",
"create",
"open",
"read",
"write",
"close",
"dir",
"rm",
"copy",
"help",
"loadfile",
""
};
const S_BYTE title1[] = "Copyright (c) Haisoft 2007-9-1\n";
const S_BYTE title2[] = "Author: Kingsea\n";
const S_BYTE title3[] = "Email: jinhailiao@163.com\n";
const S_BYTE prjver[] = "HaiBIOS ver 1.0\n";
int hai_LoadFileFromUART(void)
{
int i;
long filesize;
HFILE hfile;
char ch, Buf[528], *p = Buf;
const char *pSavefile = "C:\\TEMPFILE.BIN";
hai_printf("Please input file size:");
hai_scanf("%s", Buf);
filesize = hai_atol(Buf);
hai_printf("File size is: %d\n", filesize);
hfile = hai_fopen(pSavefile, "wb");
if (hfile == S_NULL)
{
hai_printf("File open failed!\n");
return -1;
}
hai_printf("Please start transmit:");
p = Buf;
for (i = 0; i < filesize; i++)
{
*p++ = hai_UartGetChar();
if (p-Buf == 512)
{
hai_fwrite(Buf, (size_t)(p-Buf), 1, hfile);
p = Buf;
hai_printf(".");
}
}
hai_fwrite(Buf, (size_t)(p-Buf), 1, hfile);
hai_fclose(hfile);
hai_printf("\n");
hai_printf("Run this file(y/n)");
ch = hai_UartGetChar();
hai_UartPutChar(ch);
hai_printf("\n");
if (ch == 'y' || ch == 'Y')
hai_LoadMain(pSavefile);
#ifdef TEST_LOAD_FILE
hfile = hai_fopen(pSavefile, "rb");
if (hfile)
{
while (filesize = hai_fread(Buf, 1, 512, hfile))
{
Buf[filesize] = 0;
hai_printf(Buf);
}
hai_fclose(hfile);
}
#endif
return 0;
}
S_VOID hai_Shell(S_VOID)
{
int loop = 1;
int i, err;
long size;
char cwd[260];
char cmd[260], arg[260];
HFILE hfile = 0;
HFILE hfile2 = 0;
hai_printf(prjver);
hai_printf(title1);
hai_printf(title2);
hai_printf(title3);
while (loop)
{
hai_getcwd(cwd, 260);
hai_printf(cwd);hai_printf("\\>:");
hai_scanf("%s", cmd);
for (i = 0; i < sizeof(cmdset)/sizeof(cmdset[0]); i++)
{
if (!hai_strcmp(cmd, cmdset[i]))
break;
}
switch (i)
{
case 0:
{
HFILE hftemp = hai_fopen(RUNMAINFILE, "rb");
if (hftemp)
{
hai_fclose(hftemp);
if (hfile)
hai_fclose(hfile);
if (hfile2)
hai_fclose(hfile2);
loop = 0;
}
}
break;
case 1:
hai_scanf("%s", arg);
err = hai_format(arg, 0);
break;
case 2:
hai_scanf("%s", arg);
err = hai_chdir(arg);
break;
case 3:
hai_scanf("%s", arg);
err = hai_mkdir(arg);
break;
case 4:
hai_scanf("%s", arg);
err = hai_rmdir(arg);
break;
case 5:
err = hai_flushall();
break;
case 6:
hai_scanf("%s", arg);
hfile2 = hai_fopen(arg, "w");
if (hfile2)
err = hai_fclose(hfile2);
else
err = -1;
break;
case 7:
hai_scanf("%s", arg);
if (hfile)
hai_fclose(hfile);
hfile = hai_fopen(arg, "r+");
err = hfile?0:-1;
break;
case 8:
err = hai_fseek(hfile, 0, SEEK_END);
if (!err)
{
size = hai_ftell(hfile);
hai_memset(arg, 0x00, sizeof(arg));
hai_fseek(hfile, 0, SEEK_SET);
if (size > 250)
size = 250;
if (hai_fread(arg, size, 1, hfile) == 1)
{
err = 0;
hai_printf(arg);
hai_printf("\n");
}
else
err = -1;
}
break;
case 9:
hai_scanf("%s", arg);
if (hai_fwrite(arg, hai_strlen(arg), 1, hfile) == 1)
err = 0;
else
err = -1;
break;
case 10:
if (hfile)
{
err = hai_fclose(hfile);
if (!err)
hfile = 0;
}
else
err = -1;
break;
case 11:
listdir();
err = 0;
break;
case 12:
hai_scanf("%s", arg);
err = hai_remove(arg);
break;
case 13:
hai_scanf("%s", cmd);
hai_scanf("%s", arg);
{
int num;
S_BYTE buf[512];
HFILE hfrom = hai_fopen(arg, "rb");
HFILE hto = hai_fopen(cmd, "wb");
if (!hfrom || !hto)
{
if (!hfrom) hai_printf("%s can't open!\n", cmd);
if (!hto) hai_printf("%s can't open!\n", arg);
err = -1;
}
else
{
while (num = hai_fread(buf, 1, 512, hfrom))
hai_fwrite(buf, num, 1, hto);
err = 0;
}
if (hfrom) hai_fclose(hfrom);
if (hto) hai_fclose(hto);
}
break;
case 14:
for (i = 0; i < sizeof(cmdset)/sizeof(cmdset[0]); i++)
{
hai_printf(cmdset[i]);
hai_printf("\n");
}
err = 0;
break;
case 15:
err = hai_LoadFileFromUART();
break;
default:
err = -1;
break;
}
if (err)
hai_printf("bad command or argument!\n");
else
hai_printf("OK!\n");
}
hai_flushall();
}
S_VOID hai_LoadMain(S_BYTE *pFile)
{
size_t num;
HFILE hfile;
S_BYTE *p = MainRunAddr;
MainProc *pfnMain = (MainProc*)MainRunAddr;
hfile = hai_fopen(pFile, "rb");
if (!hfile)
{
hai_printf("%s can't open!\n", pFile);
while (1);
}
while (num = hai_fread(p, 1, 512, hfile))
p += num;
hai_fclose(hfile);
#ifdef HAIBIOSSIM
hai_printf("Load Main program OK!\n");
#else
//Add yourself code here if need
pfnMain(0, 0);
#endif
while (1)
;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -