亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? filenode.c

?? 老外寫的一個(gè)文件系統(tǒng)
?? C
字號(hào):
#include "Platform.h"
#include "Debug/Debug.h"
#include "StdC.h"
#include "Hardware/DRAM.h"
#include "PageStack/PageStack.h"
#include "FileSystem/Fat32/FileTree/NameNode.h"
#include "FileSystem/Fat32/FileTree/FileNode.h"
#include "FileSystem/Fat32/FileTree/Node.h"


//#define SHOW_CREATION	// uncomment to see FileNode's get created.
//#define SHOW_VISITS		// uncomment to see FileNode's get visited.


struct FileNode
{
	ClusterNumber firstClusterOfFile;
	NameNodeHandle nameOfFile;
	unsigned long sizeInBytes;
	FileNodeHandle nextFileSibbling;		// next file, ignoring folders
	FileNodeHandle prevFileSibbling;		// prev file, ignoring folders
	FileNodeHandle firstFileOfNextFolder;	// first file in the next folder
	FileNodeHandle lastFileOfPrevFolder;	// last file in the previous folder
	char unused[4];	// structure MUST pad to 32 bytes, or any power of 2.
};


XDATA_AT(PAGE_STACK_ADDRESS) struct FileNode _FILENODE_fileNodeTablePort[BYTES_PER_PORT/sizeof(struct FileNode)];

XDATA DramPageIndex _FILENODE_nextNewFilePage;
XDATA unsigned char _FILENODE_nextNewFileIndex;

XDATA FileNodeHandle _FILENODE_lastFileOfPrevFolder;	// remember what was the last file of the previous folder.
XDATA FileNodeHandle _FILENODE_prevFile;				// remember what was the first file to be created

// these 3 variables are used to keep track of the state 
// between calls to FILENODE_DoneAddingFilesToFolder(),
// and are initialzied on each call to FILENODE_DoneAddingFilesToFolder()
XDATA static struct FileNode *_FILENODE_ReLink_scan;
XDATA static FileNodeHandle _FILENODE_ReLink_scanHandle;
XDATA static FileNodeHandle _FILENODE_ReLink_firstFileOfThisFolder;

void FILENODE_Initialize(void)
{
	_FILENODE_nextNewFilePage = DRAM_AllocatePage(_STRING_CreateStringInCODE("FILENODE Array"));
	_FILENODE_nextNewFileIndex = 0;
	_FILENODE_lastFileOfPrevFolder = NO_FILE_NODE;
	_FILENODE_prevFile = NO_FILE_NODE;
}


// This routine is adding a new file to a folder.
// It does so, by inserting itself as the first file in that folder, 
// and linking what used to be the first file, as its' sibbling instead.
FileNodeHandle FILENODE_AddFile(
	ClusterNumber startingClusterNumber,
	unsigned long sizeInBytes,
	NameNodeHandle nameOfFile)
{
	XDATA static FileNodeHandle thisHandle;	// the new file being created.
	XDATA static FileNodeHandle prevFileHandle;

	// figure out the file-handle of the new entry being created.
	thisHandle = MakeHandle(_FILENODE_nextNewFilePage, _FILENODE_nextNewFileIndex);

	// populate 'self'
	{
		XDATA static struct FileNode *self;
		self = &_FILENODE_fileNodeTablePort[GetIndexChar(thisHandle)];
		PAGESTACK_Push(GetPage(thisHandle));
		
		self->firstClusterOfFile = startingClusterNumber;
		self->nameOfFile = nameOfFile;
		self->sizeInBytes = sizeInBytes;
		
		self->nextFileSibbling = NO_FILE_NODE;
		self->prevFileSibbling = _FILENODE_prevFile;
		
		self->firstFileOfNextFolder = NO_FILE_NODE;	// this will be filled in when FILENODE_DoneAddingFilesToFolder() is called at the correct time.
		self->lastFileOfPrevFolder = _FILENODE_lastFileOfPrevFolder;
		
#ifdef SHOW_CREATION
		DbgMessage(DC_FILENODE, _STRING_CreateStringInCODE("FileNode [new]..."));
		DbgMessageHex32(DC_FILENODE, MakeHandle(_FILENODE_nextNewFilePage, _FILENODE_nextNewFileIndex));
		DbgMessageNewLine(DC_FILENODE);
		DbgHexDumpXDATA(DC_FILENODE, (XDATA char *)self, sizeof(*self));
#endif
		PAGESTACK_Pop();
	}

	// fix the 'nextSibbling' pointer of the previous file...
	if(_FILENODE_prevFile != NO_FILE_NODE)
	{
		XDATA static struct FileNode *prevFile;
		prevFile = &_FILENODE_fileNodeTablePort[GetIndexChar(_FILENODE_prevFile)];
		PAGESTACK_Push(GetPage(_FILENODE_prevFile));

		prevFile->nextFileSibbling = thisHandle;
		
		PAGESTACK_Pop();
	}

	// remember this file as our new "previous file"...
	_FILENODE_prevFile = thisHandle;

	// advance pointer for next available object	
	_FILENODE_nextNewFileIndex++;
	if(_FILENODE_nextNewFileIndex == ENTRIES(_FILENODE_fileNodeTablePort))
	{
		_FILENODE_nextNewFilePage = DRAM_AllocatePage(_STRING_CreateStringInCODE("FILENODE Array"));
		_FILENODE_nextNewFileIndex = 0;
	}

	// return our new file.
	return thisHandle;
}

// this is called after the last file has been added to a folder, but before
// any files have been added for the next folder.
void FILENODE_DoneAddingFilesToFolder(void)
{
	// go back and fix-up nextFileSibbling's and firstFileOfNextFolder's...
	// only if there has been a previous folder...
	if(_FILENODE_lastFileOfPrevFolder != NO_FILE_NODE)
	{
		// get the last file of the previous folder...
		_FILENODE_ReLink_scanHandle = _FILENODE_lastFileOfPrevFolder;	// start with last file in prev folder

		// get the first file of this folder...
		_FILENODE_ReLink_scan = &_FILENODE_fileNodeTablePort[GetIndexChar(_FILENODE_ReLink_scanHandle)];
		PAGESTACK_Push(GetPage(_FILENODE_ReLink_scanHandle));
		_FILENODE_ReLink_firstFileOfThisFolder = _FILENODE_ReLink_scan->nextFileSibbling;
		PAGESTACK_Pop();
		
		// only if there are files in the current folder...
		if(_FILENODE_ReLink_firstFileOfThisFolder == NO_FILE_NODE)
		{
			// nothing to do... this will short-circuit the 
			// FILENODE_LinkFileTreeSomeMore() routine.
			_FILENODE_ReLink_scanHandle = NO_FILE_NODE;
		}
	}
	else
	{
		// nothing to do... this will short-circuit the 
		// FILENODE_LinkFileTreeSomeMore() routine.
		_FILENODE_ReLink_scanHandle = NO_FILE_NODE;	
	}
	
	// remember new "last file of prev folder"...
	_FILENODE_lastFileOfPrevFolder = _FILENODE_prevFile;
}


char FILENODE_LinkFileTreeSomeMore(void)
{
	XDATA static char togo;
	
	// NOTE:  If the music skips or pauses while the file-tree is being built 
	// after power-up, then this number can be lowered at the cost of increased 
	// load-times for the directory tree.
	togo = 32;	// do this many files each call...
	while(_FILENODE_ReLink_scanHandle != NO_FILE_NODE)
	{
		// decrement the counter which limits the length of time 
		// this function can execute, per call.
		togo--;
		if(togo > 0)
		{
			_FILENODE_ReLink_scan = &_FILENODE_fileNodeTablePort[GetIndexChar(_FILENODE_ReLink_scanHandle)];
			PAGESTACK_Push(GetPage(_FILENODE_ReLink_scanHandle));

			if(_FILENODE_ReLink_scan->firstFileOfNextFolder == NO_FILE_NODE)
				_FILENODE_ReLink_scan->firstFileOfNextFolder = _FILENODE_ReLink_firstFileOfThisFolder;

			_FILENODE_ReLink_scanHandle = _FILENODE_ReLink_scan->prevFileSibbling;
			PAGESTACK_Pop();
		}
		else
		{
			return 0;	// not done yet!!
		}
	}

	// DONE!!
	return 1;	
}


ClusterNumber FILENODE_DiscoverFirstCluster(FileNodeHandle fileNodeHandle)
{
	XDATA static struct FileNode *self;
	XDATA static ClusterNumber startingClusterNumber;
	self = &_FILENODE_fileNodeTablePort[GetIndexChar(fileNodeHandle)];
	PAGESTACK_Push(GetPage(fileNodeHandle));
#ifdef SHOW_VISITS
	DbgMessage(DC_FILENODE, _STRING_CreateStringInCODE("FileNode [visit FirstCluster]..."));
	DbgMessageHex32(DC_FILENODE, fileNodeHandle);
	DbgMessageNewLine(DC_FILENODE);
	DbgHexDumpXDATA(DC_FILENODE, (XDATA char *)self, sizeof(*self));
#endif
	startingClusterNumber = self->firstClusterOfFile;
	PAGESTACK_Pop();
	return startingClusterNumber;
}


FileNodeHandle FILENODE_GetNextFileNodeSibbling(FileNodeHandle fileNodeHandle)
{
	XDATA static struct FileNode *self;
	XDATA static FileNodeHandle nextFileNode;
	self = &_FILENODE_fileNodeTablePort[GetIndexChar(fileNodeHandle)];
	PAGESTACK_Push(GetPage(fileNodeHandle));
#ifdef SHOW_VISITS
	DbgMessage(DC_FILENODE, _STRING_CreateStringInCODE("FileNode [visit NextFileSib]..."));
	DbgMessageHex32(DC_FILENODE, fileNodeHandle);
	DbgMessageNewLine(DC_FILENODE);
	DbgHexDumpXDATA(DC_FILENODE, (XDATA char *)self, sizeof(*self));
#endif
	nextFileNode = self->nextFileSibbling;
	PAGESTACK_Pop();
	return nextFileNode;
}


FileNodeHandle FILENODE_GetPrevFileNodeSibbling(FileNodeHandle fileNodeHandle)
{
	XDATA static struct FileNode *self;
	XDATA static FileNodeHandle nextFileNode;
	self = &_FILENODE_fileNodeTablePort[GetIndexChar(fileNodeHandle)];
	PAGESTACK_Push(GetPage(fileNodeHandle));
#ifdef SHOW_VISITS
	DbgMessage(DC_FILENODE, _STRING_CreateStringInCODE("FileNode [visit PrevFileSib]..."));
	DbgMessageHex32(DC_FILENODE, fileNodeHandle);
	DbgMessageNewLine(DC_FILENODE);
	DbgHexDumpXDATA(DC_FILENODE, (XDATA char *)self, sizeof(*self));
#endif
	nextFileNode = self->prevFileSibbling;
	PAGESTACK_Pop();
	return nextFileNode;
}

FileNodeHandle FILENODE_GetFirstFileNodeOfNextFolder(FileNodeHandle fileNodeHandle)
{
	XDATA static struct FileNode *self;
	XDATA static FileNodeHandle nextFileNode;
	self = &_FILENODE_fileNodeTablePort[GetIndexChar(fileNodeHandle)];
	PAGESTACK_Push(GetPage(fileNodeHandle));
#ifdef SHOW_VISITS
	DbgMessage(DC_FILENODE, _STRING_CreateStringInCODE("FileNode [visit NextFolder]..."));
	DbgMessageHex32(DC_FILENODE, fileNodeHandle);
	DbgMessageNewLine(DC_FILENODE);
	DbgHexDumpXDATA(DC_FILENODE, (XDATA char *)self, sizeof(*self));
#endif
	nextFileNode = self->firstFileOfNextFolder;
	PAGESTACK_Pop();
	return nextFileNode;
}

FileNodeHandle FILENODE_GetLastFileNodeOfPrevFolder(FileNodeHandle fileNodeHandle)
{
	XDATA static struct FileNode *self;
	XDATA static FileNodeHandle nextFileNode;
	self = &_FILENODE_fileNodeTablePort[GetIndexChar(fileNodeHandle)];
	PAGESTACK_Push(GetPage(fileNodeHandle));
#ifdef SHOW_VISITS
	DbgMessage(DC_FILENODE, _STRING_CreateStringInCODE("FileNode [visit PrevFolder]..."));
	DbgMessageHex32(DC_FILENODE, fileNodeHandle);
	DbgMessageNewLine(DC_FILENODE);
	DbgHexDumpXDATA(DC_FILENODE, (XDATA char *)self, sizeof(*self));
#endif
	nextFileNode = self->lastFileOfPrevFolder;
	PAGESTACK_Pop();
	return nextFileNode;
}


unsigned long FILENODE_DiscoverFileSizeInBytes(FileNodeHandle fileNodeHandle)
{
	XDATA static struct FileNode *self;
	XDATA static unsigned long sizeInBytes;
	self = &_FILENODE_fileNodeTablePort[GetIndexChar(fileNodeHandle)];
	PAGESTACK_Push(GetPage(fileNodeHandle));
#ifdef SHOW_VISITS
	DbgMessage(DC_FILENODE, _STRING_CreateStringInCODE("FileNode [visit FileSize]..."));
	DbgMessageHex32(DC_FILENODE, fileNodeHandle);
	DbgMessageNewLine(DC_FILENODE);
	DbgHexDumpXDATA(DC_FILENODE, (XDATA char *)self, sizeof(*self));
#endif
	sizeInBytes = self->sizeInBytes;
	PAGESTACK_Pop();
	return sizeInBytes;
}

NameNodeHandle FILENODE_GetFilename(FileNodeHandle fileNodeHandle)
{
	XDATA static struct FileNode *self;
	XDATA static NameNodeHandle filename;
	self = &_FILENODE_fileNodeTablePort[GetIndexChar(fileNodeHandle)];
	PAGESTACK_Push(GetPage(fileNodeHandle));
#ifdef SHOW_VISITS
	DbgMessage(DC_FILENODE, _STRING_CreateStringInCODE("FileNode [visit GetName]..."));
	DbgMessageHex32(DC_FILENODE, fileNodeHandle);
	DbgMessageNewLine(DC_FILENODE);
	DbgHexDumpXDATA(DC_FILENODE, (XDATA char *)self, sizeof(*self));
#endif
	filename = self->nameOfFile;
	PAGESTACK_Pop();
	return filename;
}

void FILENODE_Dump(FileNodeHandle fileNodeHandle)
{
	XDATA static struct FileNode *self;
	self = &_FILENODE_fileNodeTablePort[GetIndexChar(fileNodeHandle)];
	PAGESTACK_Push(GetPage(fileNodeHandle));
	DbgHexDumpXDATA(DC_FILENODE, (XDATA char *)self, sizeof(*self));
	PAGESTACK_Pop();
}


_CONSTANT_DATA(FILENODE)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本不卡视频一二三区| 一区二区三区毛片| 国产精品国产三级国产三级人妇 | 另类小说视频一区二区| 国产精品家庭影院| 日韩精品一区二区三区在线| 91精品福利在线| 国产精品一线二线三线| 婷婷综合另类小说色区| 日韩一区在线播放| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 精品视频全国免费看| 国产呦精品一区二区三区网站| 亚洲一区二区在线视频| 国产亚洲美州欧州综合国| 91精品国产91综合久久蜜臀| 色综合久久综合中文综合网| 国产激情视频一区二区在线观看 | 美腿丝袜亚洲三区| 亚洲图片有声小说| 自拍偷拍欧美精品| 久久精品视频网| 欧美一级艳片视频免费观看| 欧美制服丝袜第一页| 99久久久无码国产精品| 国产精品原创巨作av| 精品一区二区免费在线观看| 亚洲aⅴ怡春院| 一区二区三区四区蜜桃| 亚洲欧美另类小说| 国产精品久久久久久久久免费桃花| 精品国产一区二区亚洲人成毛片| 欧美美女喷水视频| 欧美日韩五月天| 欧美日本一区二区三区四区| 欧美在线三级电影| 91黄色激情网站| 色婷婷综合久久久中文字幕| 91社区在线播放| 91色porny在线视频| 91亚洲国产成人精品一区二三| 成人一二三区视频| 国产精品国产三级国产aⅴ原创| 欧洲一区二区三区免费视频| 久久成人免费日本黄色| 亚洲视频在线观看三级| 欧美视频中文字幕| 欧美性猛片xxxx免费看久爱| 777xxx欧美| 亚洲成av人在线观看| 91亚洲资源网| 欧美自拍偷拍一区| 国产一二精品视频| 日韩精品欧美成人高清一区二区| 国产日韩综合av| 精品国产伦理网| 欧美日韩在线直播| 欧美三区免费完整视频在线观看| 粉嫩绯色av一区二区在线观看| 久久99久久99精品免视看婷婷| 亚洲狠狠爱一区二区三区| 国产亚洲精品精华液| 久久综合九色综合97婷婷女人| 51精品久久久久久久蜜臀| 欧美巨大另类极品videosbest | 日韩一区二区三区电影| 一本久久a久久免费精品不卡| 91蜜桃免费观看视频| 91国偷自产一区二区三区观看 | 在线观看日韩毛片| 成人看片黄a免费看在线| 91看片淫黄大片一级| 亚洲视频在线一区观看| 欧美精选在线播放| 欧美国产乱子伦| 亚洲精选一二三| 三级久久三级久久| 国产伦精一区二区三区| 91小视频在线观看| 欧美精品99久久久**| 久久久精品免费观看| 亚洲女同一区二区| 男男gaygay亚洲| 成人av电影在线| 欧美一区二区三区在线观看视频| 国产欧美综合色| 亚洲成精国产精品女| 国产高清精品网站| 欧美三级视频在线观看| 久久这里只有精品首页| 亚洲蜜臀av乱码久久精品蜜桃| 免费成人av在线播放| 97精品久久久久中文字幕| 欧美一级高清大全免费观看| 中文字幕永久在线不卡| 美女在线一区二区| 色视频成人在线观看免| 26uuu精品一区二区在线观看| 一区二区三区 在线观看视频| 极品少妇xxxx精品少妇偷拍| 在线观看中文字幕不卡| 国产欧美一区在线| 久久精品久久精品| 欧美主播一区二区三区| 欧美高清在线一区| 免播放器亚洲一区| 欧美在线视频你懂得| 国产精品久久久久精k8| 极品少妇xxxx精品少妇偷拍| 欧美精品国产精品| 亚洲精品视频观看| 9191成人精品久久| 成人欧美一区二区三区白人| 韩国欧美国产1区| 欧美精品久久久久久久多人混战| 亚洲人成网站精品片在线观看| 国产精品一区二区久久不卡 | 日韩欧美国产系列| 亚洲第一主播视频| 色综合视频一区二区三区高清| 国产三区在线成人av| 美女久久久精品| 337p亚洲精品色噜噜噜| 亚洲主播在线观看| 91丨九色丨蝌蚪丨老版| 国产精品伦一区二区三级视频| 国精产品一区一区三区mba桃花| 欧美一区二区视频网站| 日韩中文字幕av电影| 欧美日韩一区二区三区四区| 一区二区三区不卡视频| 在线中文字幕不卡| 又紧又大又爽精品一区二区| 91蜜桃在线免费视频| 成人免费小视频| 91一区二区三区在线播放| 亚洲视频精选在线| 色www精品视频在线观看| 亚洲日本一区二区| 91免费版在线| 亚洲一区二区三区视频在线播放| 91国在线观看| 五月天久久比比资源色| 欧美一区二区三区小说| 久久电影网站中文字幕| 久久午夜免费电影| 丰满白嫩尤物一区二区| 国产精品久久久久久久久久免费看| 成人免费视频一区| 国产精品成人在线观看| 色妞www精品视频| 亚洲成人动漫在线免费观看| 777奇米四色成人影色区| 免费亚洲电影在线| 精品国产伦一区二区三区观看方式| 经典三级视频一区| 国产精品久久久久永久免费观看 | 91精品麻豆日日躁夜夜躁| 美日韩黄色大片| 国产清纯白嫩初高生在线观看91| 99久久精品免费看| 亚洲va国产va欧美va观看| 日韩一区二区在线看| 高清不卡一区二区| 一区二区三区波多野结衣在线观看| 欧美精品v国产精品v日韩精品| 久久精品国产亚洲高清剧情介绍| 国产日韩欧美制服另类| 色婷婷国产精品久久包臀 | 国内精品嫩模私拍在线| 综合激情成人伊人| 日韩欧美一级精品久久| 成人黄色大片在线观看| 婷婷久久综合九色综合绿巨人| 精品国产伦一区二区三区免费| www.欧美.com| 婷婷亚洲久悠悠色悠在线播放| 久久精品亚洲乱码伦伦中文| 欧美在线影院一区二区| 麻豆国产欧美日韩综合精品二区| 久久久国产精品不卡| 色嗨嗨av一区二区三区| av亚洲精华国产精华精华| 视频一区视频二区中文| www成人在线观看| 欧美综合久久久| 韩国午夜理伦三级不卡影院| 亚洲欧洲成人自拍| 欧美成人伊人久久综合网| 国产91富婆露脸刺激对白| 亚洲伦在线观看| 久久夜色精品国产噜噜av| 91黄色免费观看| 粉嫩aⅴ一区二区三区四区五区| 亚洲韩国精品一区| 91精品国产一区二区三区香蕉| 成人黄色大片在线观看| 午夜精品福利在线| 26uuu精品一区二区| 欧美性做爰猛烈叫床潮|