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

📄 filebuf.c

📁 一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上
💻 C
字号:
/*************************************************************************
* Copyright  2002 National ASIC Center, All right Reserved
*
* FILE NAME: filebuf.c
* PROGRAMMER: DSA
* Date of Creation: 2002/08/05
* DESCRIPTION: This module is about operation of 
*				imformation of files which have been opened
*
* NOTE:		In this module,we don't check the parameter
*
* FUNCTIONS LIST:
* -------------------------------------------------------------------------
* init_FILE_buf()
* get_FILE()
* remove_FILE()
*-------------------------------------------------------------------------
* MODIFICATION HISTORY
*
* 2002/08/05 by DSA Creation of this file
* 2002/08/29 by DSA add get_fscb_item( fp ) in get_FILE()
* 2002/09/02 by DSA add the judge about creating directory
******************************************************************************/
//#include <stdio.h>
#include <string.h>
//#include <stdlib.h>

#include <filesys\fs.h>
#include "filebuf.h"
#include "file.h"

#if 0
FILE_S filebuf[MAX_OPEN_FILE] = {
		/*flags, curp, magic, fcb, pointer, path, use, curfcb, curblkid  */
		{	0,	0,	0,	NULL,	NULL,	NULL,	0,	NULL,	0	},
		{	0,	0,	0,	NULL,	NULL,	NULL,	0,	NULL,	0	},
		{	0,	0,	0,	NULL,	NULL,	NULL,	0,	NULL,	0	},
		{	0,	0,	0,	NULL,	NULL,	NULL,	0,	NULL,	0	},
		{	0,	0,	0,	NULL,	NULL,	NULL,	0,	NULL,	0	},
		{	0,	0,	0,	NULL,	NULL,	NULL,	0,	NULL,	0	},
		{	0,	0,	0,	NULL,	NULL,	NULL,	0,	NULL,	0	},
		{	0,	0,	0,	NULL,	NULL,	NULL,	0,	NULL,	0	},
		{	0,	0,	0,	NULL,	NULL,	NULL,	0,	NULL,	0	},
		{	0,	0,	0,	NULL,	NULL,	NULL,	0,	NULL,	0	},
		/*{	0,	NULL,	0,	NULL,	NULL,	NULL,	0,	NULL,	0	},*/
	};
#endif

FILE_S filebuf[MAX_OPEN_FILE];

void init_FILE_buf( void )
{
	int i;
	
	for ( i = 0; i < MAX_OPEN_FILE; i++ )
		memset( &filebuf[i], 0, sizeof(FILE_S) );
}


FILE_S* get_FILE( char* path, int mode )
{
	register FILE_S* p, *q;
	int i;
	
	q = NULL;
	/* LOCK should be added here! */
	FS_LOCK( FILEBUFFER_LOCK_ID );
	
	if( *(path + strlen( path ) - 1) == '/' ){
		get_FCB( path, mode );
		goto EXIT_ENTRY;
	}
	
	
	/* compare the path, search the file which has been opened*/
	for(i = 0, p = filebuf; i < MAX_OPEN_FILE; i++, p++){
		if( p->flag == BE_USED && strcmp( path, p->path ) == 0 ){
			get_fscb_item( p );//02-8-29 11:33
			p->use++;
			q = p;
			goto EXIT_ENTRY;
		}
	}
	/* find the free number of array, and fill it*/
	for(i = 0, p = filebuf; i < MAX_OPEN_FILE; i++, p++){
		if( p->flag == NOT_BE_USED ){
			if( open_file( path, p, mode ) < 0 ) break;
			q = p;
			break;
		}
	}
	
EXIT_ENTRY:
	/* UNLOCK should be added here!*/
	FS_UNLOCK( FILEBUFFER_LOCK_ID );
	return q;
}


int remove_FILE( FILE_S* fp )
{
	if( fp->magic != FILE_MAGIC ) return FS_ERR_MAGIC;
	
	/* LOCK should be added here! */
	FS_LOCK( FILEBUFFER_LOCK_ID );
	
	if( fp->use == 1 ){
		close_file( fp );
		memset((unsigned char *)fp,0x00,sizeof( FILE_S ) );
	}else{
		fp->use--;
	}
	
	/* UNLOCK should be added here!*/
	FS_UNLOCK( FILEBUFFER_LOCK_ID );
	
	return FS_OK;
}

/*
* add by DSA 2002/11/04
* close file immediately
*
*/
int remove_FILEnow( FILE_S* fp )
{
	if( fp->magic != FILE_MAGIC ) return FS_ERR_MAGIC;
	
	/* LOCK should be added here! */
	FS_LOCK( FILEBUFFER_LOCK_ID );
	
	
	close_file( fp );
	fp->use--;
	if( fp->use == 0 )
		memset((unsigned char *)fp,0x00,sizeof( FILE_S ) );
	
	
	/* UNLOCK should be added here!*/
	FS_UNLOCK( FILEBUFFER_LOCK_ID );
	
	return FS_OK;
}

⌨️ 快捷键说明

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