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

📄 helper_cmds.c

📁 nandflash文件系统源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	return TRUE;
}

BOOL cmdCat(const char *tail)
{
	uffs_Object *obj;
	const char *name;
	char buf[100];
	int len;

	if (!tail) return FALSE;
	name = cli_getparam(tail, NULL);

	obj = uffs_GetObject();
	if (!obj) return FALSE;

	if (uffs_OpenObject(obj, name, UO_RDONLY, US_IREAD) == U_FAIL) {
		uffs_Perror(UFFS_ERR_NORMAL, "Can't open %s\n", name);
		goto fail;
	}

	while (uffs_EndOfFile(obj) == 0) {
		len = uffs_ReadObject(obj, buf, sizeof(buf) - 1);
		if (len == 0) break;
		if (len > 0) {
			buf[len] = 0;
			uffs_Perror(UFFS_ERR_NORMAL, "%s", buf);
		}
	}
	uffs_Perror(UFFS_ERR_NORMAL, "\n");
	uffs_CloseObject(obj);

fail:
	uffs_PutObject(obj);

	return TRUE;
}


static URET test_verify_file(const char *file_name)
{
	uffs_Object *f = NULL;
	int ret = U_FAIL;
	unsigned char buf[100];
	int i, pos, len;

	f = uffs_GetObject();
	if (f == NULL) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Fail to get object.\n");
		goto test_exit;
	}

	if (uffs_OpenObject(f, file_name, UO_RDONLY, US_IREAD) != U_SUCC) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Can't open file %s for read.\n", file_name);
		goto test_exit;
	}

	pos = 0;
	while (!uffs_EndOfFile(f)) {
		len = uffs_ReadObject(f, buf, sizeof(buf));
		for (i = 0; i < len; i++) {
			if (buf[i] != (pos++ & 0xFF)) {
				pos--;
				uffs_Perror(UFFS_ERR_NORMAL, PFX"Verify file %s failed at: %d, expect %x but got %x\n", file_name, pos, pos & 0xFF, buf[i]);
				goto test_failed;
			}
		}
	}

	if (pos != uffs_SeekObject(f, 0, USEEK_END)) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Verify file %s failed. invalid file length.\n", file_name);
		goto test_failed;
	}

	uffs_Perror(UFFS_ERR_NORMAL, PFX"Verify file %s succ.\n", file_name);
	ret = U_SUCC;

test_failed:
	uffs_CloseObject(f);

test_exit:
	uffs_PutObject(f);
	return ret;
}

static URET do_write_test_file(uffs_Object *f, int size)
{
	long pos;
	unsigned char buf[100];
	unsigned char data;
	int i, len;

	while (size > 0) {
		pos = uffs_SeekObject(f, 0, USEEK_CUR);
		len = (size > sizeof(buf) ? sizeof(buf) : size);
		data = pos & 0xFF;
		for (i = 0; i < len; i++, data++) {
			buf[i] = data;
		}
		if (uffs_WriteObject(f, buf, len) != len) {
			uffs_Perror(UFFS_ERR_NORMAL, PFX"Write file failed, size %d at %d\n", len, pos);
			return U_FAIL;
		}
		size -= len;
	}

	return U_SUCC;
}

static URET test_append_file(const char *file_name, int size)
{
	int ret = U_FAIL;
	uffs_Object *f = NULL;

	f = uffs_GetObject();
	if (f == NULL) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Fail to get object.\n");
		goto test_exit;
	}

	if (uffs_OpenObject(f, file_name, UO_RDWR|UO_APPEND|UO_CREATE, US_IREAD|US_IWRITE) != U_SUCC) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Can't open file %s for append.\n", file_name);
		goto test_exit;
	}

	uffs_SeekObject(f, 0, USEEK_END);

	if (do_write_test_file(f, size) == U_FAIL) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Write file %s failed.\n", file_name);
		goto test_failed;
	}
	ret = U_SUCC;

test_failed:
	uffs_CloseObject(f);

test_exit:
	if (f) uffs_PutObject(f);
	return ret;
}

static URET test_write_file(const char *file_name, int pos, int size)
{
	int ret = U_FAIL;
	uffs_Object *f = NULL;

	f = uffs_GetObject();
	if (f == NULL) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Fail to get object.\n");
		goto test_exit;
	}

	if (uffs_OpenObject(f, file_name, UO_RDWR|UO_CREATE, US_IREAD|US_IWRITE) != U_SUCC) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Can't open file %s for write.\n", file_name);
		goto test_exit;
	}

	if (uffs_SeekObject(f, pos, USEEK_SET) != pos) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Can't seek file %s at pos %d\n", file_name, pos);
		goto test_failed;
	}

	if (do_write_test_file(f, size) == U_FAIL) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Write file %s failed.\n", file_name);
		goto test_failed;
	}
	ret = U_SUCC;

test_failed:
	uffs_CloseObject(f);

test_exit:
	if (f) uffs_PutObject(f);
	return ret;
}


static URET DoTest2(void)
{
	uffs_Object *f;
	URET ret = U_FAIL;
	char buf[100], buf_1[100];

	f = uffs_GetObject();
	if (f == NULL) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Fail to get object.\n");
		goto exit_test;
	}

	ret = uffs_OpenObject(f, "/abc/", UO_RDWR|UO_DIR, US_IREAD|US_IWRITE);
	if (ret != U_SUCC) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Can't open dir abc, err: %d\n", f->err);
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Try to create a new one...\n");
		ret = uffs_OpenObject(f, "/abc/", UO_RDWR|UO_CREATE|UO_DIR, US_IREAD|US_IWRITE);
		if (ret != U_SUCC) {
			uffs_Perror(UFFS_ERR_NORMAL, PFX"Can't create new dir /abc/\n");
			goto exit_test;
		}
		else {
			uffs_CloseObject(f);
		}
	}
	else {
		uffs_CloseObject(f);
	}
	
	ret = uffs_OpenObject(f, "/abc/test.txt", UO_RDWR|UO_CREATE, US_IWRITE|US_IREAD);
	if (ret != U_SUCC) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Can't open /abc/test.txt\n");
		goto exit_test;
	}

	sprintf(buf, "123456789ABCDEF");
	ret = uffs_WriteObject(f, buf, strlen(buf));
	uffs_Perror(UFFS_ERR_NORMAL, PFX"write %d bytes to file, content: %s\n", ret, buf);

	ret = uffs_SeekObject(f, 3, USEEK_SET);
	uffs_Perror(UFFS_ERR_NORMAL, PFX"new file position: %d\n", ret);

	memset(buf_1, 0, sizeof(buf_1));
	ret = uffs_ReadObject(f, buf_1, 5);
	uffs_Perror(UFFS_ERR_NORMAL, PFX"read %d bytes, content: %s\n", ret, buf_1);

	if (memcmp(buf + 3, buf_1, 5) != 0) {
		ret = U_FAIL;
	}
	else {
		ret = U_SUCC;
	}

	uffs_CloseObject(f);

exit_test:
	if (f) {
		uffs_PutObject(f);
	}

	return ret;
}

BOOL cmdTest1(const char *tail)
{
	uffs_Object *f;
	URET ret;
	char buf[100];
	const char *name;

	if (!tail) {
		return FALSE;
	}

	name = cli_getparam(tail, NULL);

	f = uffs_GetObject();
	if (f == NULL) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Fail to get object.\n");
		return TRUE;	
	}

	ret = uffs_OpenObject(f, name, UO_RDWR|UO_CREATE|UO_TRUNC, US_IWRITE|US_IREAD);
	if (ret != U_SUCC) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX"Can't open %s\n", name);
		goto fail;
	}

	sprintf(buf, "123456789ABCDEF");
	ret = uffs_WriteObject(f, buf, strlen(buf));
	uffs_Perror(UFFS_ERR_NORMAL, PFX"write %d bytes to file, content: %s\n", ret, buf);

	ret = uffs_SeekObject(f, 3, USEEK_SET);
	uffs_Perror(UFFS_ERR_NORMAL, PFX"new file position: %d\n", ret);

	memset(buf, 0, sizeof(buf));
	ret = uffs_ReadObject(f, buf, 5);
	uffs_Perror(UFFS_ERR_NORMAL, PFX"read %d bytes, content: %s\n", ret, buf);

	uffs_CloseObject(f);

fail:
	uffs_PutObject(f);

	return TRUE;
}

BOOL cmdTest2(const char *tail)
{
	uffs_Perror(UFFS_ERR_NORMAL, "Test return: %s !\n", DoTest2() == U_SUCC ? "succ" : "failed");

	return TRUE;
}

BOOL cmdTest3(const char *tail)
{
	const char *name;
	int i;
	int write_test_seq[] = { 20, 10, 500, 40, 1140, 900, 329, 4560, 352, 1100 };

	if (!tail) {
		return FALSE;
	}

	name = cli_getparam(tail, NULL);
	uffs_Perror(UFFS_ERR_NORMAL, "Test append file %s ...\n", name);
	for (i = 1; i < 500; i += 29) {
		if (test_append_file(name, i) != U_SUCC) {
			uffs_Perror(UFFS_ERR_NORMAL, "Append file %s test failed at %d !\n", name, i);
			return TRUE;
		}
		//if (test_verify_file(name) != U_SUCC) {
		//	uffs_Perror(UFFS_ERR_NORMAL, "Verify file %s failed at test no: %d.\n", name, i);
		//}
	}

	uffs_Perror(UFFS_ERR_NORMAL, "Check file %s ... \n", name);
	if (test_verify_file(name) != U_SUCC) {
		uffs_Perror(UFFS_ERR_NORMAL, "Verify file %s failed.\n", name);
		return TRUE;
	}

	uffs_Perror(UFFS_ERR_NORMAL, "Test write file ...\n");
	for (i = 0; i < sizeof(write_test_seq) / sizeof(int) - 1; i++) {
		if (test_write_file(name, write_test_seq[i], write_test_seq[i+1]) != U_SUCC) {
			uffs_Perror(UFFS_ERR_NORMAL, "Test write file failed !\n");
			return TRUE;
		}
	}

	uffs_Perror(UFFS_ERR_NORMAL, "Check file %s ... \n", name);
	if (test_verify_file(name) != U_SUCC) {
		uffs_Perror(UFFS_ERR_NORMAL, "Verify file %s failed.\n", name);
		return TRUE;
	}

	uffs_Perror(UFFS_ERR_NORMAL, "Test succ !\n");

	return TRUE;
}

BOOL cmdMount(const char *tail)
{
	uffs_mountTable *tab = uffs_GetMountTable();
	tail = tail;
	while (tab) {
		uffs_Perror(UFFS_ERR_NORMAL, PFX" %s : (%d) ~ (%d)\n", tab->mountPoint, tab->startBlock, tab->endBlock);
		tab = tab->next;
	}
	return TRUE;
}

static struct cli_commandset cmdset[] = 
{
    { cmdFormat,	"format",		"[<mount>]",		"Format device" },
    { cmdMkf,		"mkfile",		"<name>",			"create a new file" },
    { cmdMkdir,		"mkdir",		"<name>",			"create a new directory" },
    { cmdRm,		"rm",			"<name>",			"delete file/directory" },
    { cmdRen,		"mv|ren",		"<old> <new>",		"rename file/directory" },
    { cmdLs,		"ls",			"<dir>",			"list dirs and files" },
    { cmdSt,		"info|st",		"<mount>",			"show statistic infomation" },
    { cmdTest1,		"t1",			"<name>",			"test 1" },
    { cmdTest2,		"t2",			NULL,				"test 2" },
    { cmdTest3,		"t3",			"<name>",			"test 3" },
    { cmdCp,		"cp",			"<src> <des>",		"copy files. the local file name start with '::'" },
    { cmdCat,		"cat",			"<name>",			"show file content" },
    { cmdPwd,		"pwd",			NULL,				"show current dir" },
    { cmdCd,		"cd",			"<path>",			"change current dir" },
    { cmdMount,		"mount",		NULL,				"list mounted file systems" },

    { NULL, NULL, NULL, NULL }
};


struct cli_commandset * get_helper_cmds()
{
	return cmdset;
};

⌨️ 快捷键说明

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