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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rdcf2.c

?? FAT16 Filesystem on Philips LPC2000 series processors
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*-----------------------------------------------------------------------------          RDCF: A Reentrant DOS-Compatible File System, Version 2.0   Public Domain - No Restrictions on Use by Philip J. Erdelsky pje@acm.org                               January 15, 1993 Nov 11, 2005 -- Tom Walsh <tom@openharware.net>    Adapted for use under gcc + ARM + NewLib.-----------------------------------------------------------------------------*//* #define _BIG_ENDIAN */#include "rdcf2.h"#include <string.h>#include <ctype.h>#include <stdio.h>#include <time.h>#include <sys/time.h>#include <types.h>#include <sysdefs.h>#include <sys/errno.h>#include <sys/fcntl.h>#ifdef HAS_MMC#define SECTOR_SIZE RDCF_SECTOR_SIZE#define ENTRIES_PER_SECTOR  (SECTOR_SIZE/sizeof(struct directory))#define NO_DIRECTORY_INDEX  0xFFFF/* Special values for first byte of name. */#define END_DIRECTORY     0x00#define DELETED_FILE      0xE5/* Special values for FAT entries. */#define EMPTY_CLUSTER            0#define RESERVED_CLUSTER_12_BIT  0xFF0#define LAST_CLUSTER_12_BIT      0xFF8#define LAST_CLUSTER_16_BIT      0xFFF8/* buffer status */enum buffer_status {EMPTY, CLEAN, DIRTY};/* additional mode bit */#define WRITTEN    (1<<7)/*-----------------------------------------------------------------------------Layout of first sector when read into buffer[].  A simple structure would notbe portable because some words are not aligned on even addresses.-----------------------------------------------------------------------------*/#define BYTES_PER_SECTOR     (buffer[11]|buffer[12]<<8)#define SECTORS_PER_CLUSTER   buffer[13]#define RESERVED_SECTORS     (buffer[14]|buffer[15]<<8)#define NUMBER_OF_FATS        buffer[16]#define ROOT_ENTRIES         (buffer[17]|buffer[18]<<8)#define TOTAL_SECTORS        (buffer[19]|buffer[20]<<8)#define MEDIA_DESCRIPTOR      buffer[21]#define SECTORS_PER_FAT      (buffer[22]|buffer[23]<<8)#define SECTORS_PER_TRACK    (buffer[24]|buffer[25]<<8)#define HEADS                (buffer[26]|buffer[27]<<8)#define HIDDEN_SECTORS       (buffer[28]|buffer[29]<<8)/*-----------------------------------------------------------------------------The following functions and macros convert words and double words from "bigendian" to "little endian" form or vice-versa.-----------------------------------------------------------------------------*/#ifdef _BIG_ENDIANstatic void swap_two(uchar *p){	uchar x = p[0];	p[0] = p[1];	p[1] = x;}static void swap_four(uchar *p){	uchar x = p[0];	p[0] = p[3];	p[3] = x;	swap_two(p+1);}  #define convert_short(x) swap_two((uchar *)(&(x)))  #define convert_long(x)  swap_four((uchar *)(&(x)))#endifstatic void rdcf_get_date_and_time(struct rdcf_date_and_time *p){	struct tm dateTime;	struct timeval	temp;	time_t now;	gettimeofday(&temp, 0);	now = temp.tv_sec;	localtime_r(&now, &dateTime);		// time is correct.	p->hour = dateTime.tm_hour;	p->minute = dateTime.tm_min;	p->second = dateTime.tm_sec;	p->month = dateTime.tm_mon+1;	p->day = dateTime.tm_mday;	p->year = dateTime.tm_year+1900;}/*-----------------------------------------------------------------------------This function calls longjmp() to specify an error code and exit from the RDCFfunction originally called.-----------------------------------------------------------------------------*/static void error_exit(struct rdcf *f, int error){  longjmp(f->error, error);}/*-----------------------------------------------------------------------------These macros make the calls on access_sector() more readable.-----------------------------------------------------------------------------*/static void read_sector (struct rdcf *f, unsigned sector, void *buffer){	f->drive_error = f->ReadSector(sector, buffer);	if (f->drive_error != 0) error_exit(f, ~EIO);}static void write_sector (struct rdcf *f, unsigned sector, const uchar *buffer){	f->drive_error = f->WriteSector(sector, buffer);	if (f->drive_error != 0) error_exit(f, ~EIO);}	/*-----------------------------------------------------------------------------This function writes the buffer in the FCB if it is marked as "dirty".-----------------------------------------------------------------------------*/static void flush_buffer(struct rdcf *f){	if (f->buffer_status == DIRTY) {			// here is where we keep from thrashing while doing FAT operations.			// if the sector to be written is in the first FAT table, then			// mirror the write to corresponding sector in second FAT.		write_sector(f, f->sector_in_buffer, f->buffer.buf);		if ((f->sector_in_buffer >= f->first_FAT_sector) &&				(f->sector_in_buffer <= f->first_FAT_sector+f->sectors_per_FAT)) {				// mirror.			write_sector(f, f->sector_in_buffer+f->sectors_per_FAT, f->buffer.buf);		}		f->buffer_status = CLEAN;	}}/*-----------------------------------------------------------------------------This function reads a sector into the buffer in the FCB, if it is not alreadythere.  If another sector is there, the buffer is first flushed.-----------------------------------------------------------------------------*/static void read_buffer(struct rdcf *f, unsigned sector){	if (f->buffer_status == EMPTY || sector != f->sector_in_buffer) {		flush_buffer(f);		read_sector(f, sector, f->buffer.buf);		f->sector_in_buffer = sector;		f->buffer_status = CLEAN;	}}/*-----------------------------------------------------------------------------This function checks to see if a cluster number is valid and declares an errorif it is not.-----------------------------------------------------------------------------*/static void check_cluster(struct rdcf *f, unsigned cluster){	if (cluster < 2 || cluster > f->maximum_cluster_number)		error_exit(f, ~ESPIPE);}/*-----------------------------------------------------------------------------This function returns the FAT entry for the specified cluster.Reads from first copy of FAT.-----------------------------------------------------------------------------*/static unsigned FAT_entry(struct rdcf *f, unsigned cluster){	check_cluster(f, cluster);	if (f->maximum_cluster_number < RESERVED_CLUSTER_12_BIT) {		unsigned byte_index = cluster + (cluster>>1);		uchar p[2];		read_buffer(f, f->first_FAT_sector + byte_index/SECTOR_SIZE);		p[0] = f->buffer.buf[byte_index%SECTOR_SIZE];		byte_index++;		read_buffer(f, f->first_FAT_sector + byte_index/SECTOR_SIZE);		p[1] = f->buffer.buf[byte_index%SECTOR_SIZE];		return (cluster&1) ? (p[1]<<4 | p[0]>>4) : (p[0] | p[1])<<8&0xF00;	} else {		ushort x;		read_buffer(f, f->first_FAT_sector + cluster/(SECTOR_SIZE/2));		x = f->buffer.fat[cluster%(SECTOR_SIZE/2)];		#ifdef _BIG_ENDIAN		convert_short(x);		#endif		return x;	}}/*-----------------------------------------------------------------------------This function sets the FAT entry for the specified cluster to the specifiedvalue.  The 12-bit FAT entry always occupies two consecutive bytes, filling onebyte completely and filling only one nibble of the other byte.  Since thesebytes may be in different sectors, two separate calls on read_buffer() areused.  The one-sector caching implemented by read_buffer() prevents multipledisk accesses when both bytes are in the same sector.  Every copy of the FAT isupdated in the same way.-----------------------------------------------------------------------------*/static void set_FAT_entry(struct rdcf *f, unsigned cluster, unsigned x){	unsigned sector;	check_cluster(f, cluster);#ifdef _BIG_ENDIAN	if (f->maximum_cluster_number >= RESERVED_CLUSTER_12_BIT)		convert_short(x);#endif	sector = f->first_FAT_sector;	if (f->maximum_cluster_number < RESERVED_CLUSTER_12_BIT) {		unsigned byte_index = cluster + (cluster>>1);		uchar *p;		read_buffer(f, sector + byte_index/SECTOR_SIZE);		p = f->buffer.buf + byte_index%SECTOR_SIZE;		*p = (cluster&1) ? (*p & 0x0F) | (x<<4) : x;		f->buffer_status = DIRTY;		read_buffer(f, sector + (byte_index+1)/SECTOR_SIZE);		p = f->buffer.buf + (byte_index+1)%SECTOR_SIZE;		*p = (cluster&1) ? x>>4 : (*p&0xF0) | (x>>8);	} else {		read_buffer(f, sector + cluster/(SECTOR_SIZE/2));		f->buffer.fat[cluster%(SECTOR_SIZE/2)] = x;	}	f->buffer_status = DIRTY;}/*-----------------------------------------------------------------------------This function checks the value of c (which is always in the range from 0 to255, inclusive). If it represents a character that cannot appear in a validfile name or extension, it bails out.-----------------------------------------------------------------------------*/static void check_file_character(struct rdcf *f, unsigned c){	static uchar table[32] = {		0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xDC, 0x00, 0xFC,		0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x90,		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF	};	if (table[c>>3] & 1<<(c&7)) error_exit(f, ~EINVAL);}/*-----------------------------------------------------------------------------This function edits a file or directory spec into the name-extension form usedin the file directory entry.  It returns a pointer to the characterfollowing the last one of the spec.-----------------------------------------------------------------------------*/static const char *spec_to_name_extension(struct rdcf *f,	uchar *name_extension, const uchar *spec){	unsigned i = 0;	unsigned c;	while ((c=(*spec++))!=0 && c!=RDCF_SLASH_CHAR && c!='.') {		check_file_character(f,c);		if (i<NAME_SIZE) name_extension[i++] = toupper(c);	}	if (i==0) error_exit(f, ~EINVAL);	while (i<NAME_SIZE) name_extension[i++] = ' ';	if (c=='.') while ((c=(*spec++))!=0 && c!=RDCF_SLASH_CHAR) {		check_file_character(f,c);		if (i<NAME_SIZE+EXTENSION_SIZE) name_extension[i++] = toupper(c);	}	while (i<NAME_SIZE+EXTENSION_SIZE) name_extension[i++] = ' ';	return spec-1;}/*-----------------------------------------------------------------------------This function edits the name-extension form used in a file entry to file spec.-----------------------------------------------------------------------------*/static void name_extension_to_spec(uchar *spec, const uchar *name_extension){	unsigned i;	uchar *s = spec;	for (i=0; i<NAME_SIZE && name_extension[i]!=' '; i++)		*s++ = name_extension[i];	if (name_extension[NAME_SIZE]!=' ') {		*s++ = '.';		for (i=NAME_SIZE;				i<NAME_SIZE+EXTENSION_SIZE && name_extension[i]!=' '; i++) {			*s++ = name_extension[i];		}	}	*s = 0;}/*-----------------------------------------------------------------------------This function calculates the number of the first sector in the specifiedcluster.-----------------------------------------------------------------------------*/static unsigned first_sector_in_cluster(struct rdcf *f, unsigned cluster){	check_cluster(f, cluster);	return f->first_data_sector + (cluster-2) * f->sectors_per_cluster;}/*-----------------------------------------------------------------------------This function finds the directory entry referred to by f->directory_cluster andf->directory_index, reads it into f->buffer, and returns a pointer to it.-----------------------------------------------------------------------------*/static struct directory *find_directory(struct rdcf *f){	read_buffer(f, (f->directory_cluster == 0 ? f->first_directory_sector :		first_sector_in_cluster(f, f->directory_cluster)) +		f->directory_index/ENTRIES_PER_SECTOR);	return &f->buffer.dir[f->directory_index%ENTRIES_PER_SECTOR];} /*-----------------------------------------------------------------------------This function updates a directory entry.  If the "delete_entry" parameter istrue (nonzero), it also marks the entry as deleted.-----------------------------------------------------------------------------*/static void update_directory_entry(struct rdcf *f, int delete_entry){	struct directory *d = find_directory(f);	if (f->file.attribute & RDCF_VOLUME || f->file.spec[0] == '.')		memcpy(d->name_extension, f->file.spec, NAME_SIZE+EXTENSION_SIZE);	else		spec_to_name_extension(f, d->name_extension, f->file.spec);	if (delete_entry) d->name_extension[0] = DELETED_FILE;	d->attribute = f->file.attribute;	d->date = (f->file.date_and_time.year-1980)<<9 |	f->file.date_and_time.month<<5 | f->file.date_and_time.day;	d->time = f->file.date_and_time.hour<<11 |	f->file.date_and_time.minute<<5 | f->file.date_and_time.second>>1;	d->first_cluster = f->file.first_cluster;	d->size = f->file.size;	memset(d->reserved, 0, sizeof(d->reserved));#ifdef _BIG_ENDIAN	convert_short(d->date);	convert_short(d->time);	convert_short(d->first_cluster);	convert_long(d->size);#endif	f->buffer_status = DIRTY;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品区一区二区三区| 制服丝袜亚洲播放| 中文字幕欧美日韩一区| 国产精品66部| 国产精品无人区| 色999日韩国产欧美一区二区| 亚洲精品中文字幕乱码三区 | 黑人精品欧美一区二区蜜桃| 精品欧美一区二区久久| 国产91综合网| 亚洲人成电影网站色mp4| 日本精品视频一区二区| 天堂蜜桃91精品| 久久婷婷一区二区三区| 99re在线精品| 日韩电影在线看| 国产午夜三级一区二区三| 成人a区在线观看| 一区二区三区成人| 日韩一区二区中文字幕| 国产美女久久久久| 一区二区三区四区中文字幕| 日韩一区二区免费电影| 国产.欧美.日韩| 亚洲福利一二三区| 精品剧情在线观看| 色激情天天射综合网| 热久久免费视频| 中文字幕一区二区三区四区 | 视频一区二区三区在线| 国产亚洲精品资源在线26u| 色妞www精品视频| 久久国产精品无码网站| 亚洲视频在线一区二区| 91精品国产高清一区二区三区| 国产一区二区在线观看视频| 夜夜揉揉日日人人青青一国产精品 | 免费在线看成人av| 国产精品视频一二三| 3d动漫精品啪啪1区2区免费| 大美女一区二区三区| 三级精品在线观看| 国产精品麻豆欧美日韩ww| 91精品麻豆日日躁夜夜躁| 9i看片成人免费高清| 久久精品久久精品| 亚洲激情自拍视频| 中文字幕 久热精品 视频在线| 欧美日韩精品一区二区三区蜜桃| 成人听书哪个软件好| 美国欧美日韩国产在线播放| 亚洲另类在线制服丝袜| 国产人妖乱国产精品人妖| 欧美一区二区三区啪啪| 欧美日韩亚洲综合一区| 99久久精品国产一区| 国产高清精品久久久久| 玖玖九九国产精品| 日韩精品视频网| 亚洲精品视频一区| 国产精品不卡一区二区三区| 久久视频一区二区| 日韩精品一区二区三区老鸭窝| 欧美四级电影在线观看| 91日韩精品一区| 成人av电影在线| 国产.欧美.日韩| 成人午夜免费电影| 成人综合婷婷国产精品久久免费| 韩国理伦片一区二区三区在线播放| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲国产成人高清精品| 亚洲午夜久久久久| 精品一区二区三区在线观看| 日韩高清不卡在线| 午夜精品免费在线| 午夜伦欧美伦电影理论片| 亚洲成人精品一区二区| 一片黄亚洲嫩模| 亚洲国产精品久久久久秋霞影院| 亚洲国产欧美在线| 亚洲高清久久久| 日韩福利电影在线| 蜜乳av一区二区| 黄一区二区三区| 国产不卡视频一区二区三区| 大美女一区二区三区| 91在线精品秘密一区二区| 91亚洲精华国产精华精华液| 91久久国产最好的精华液| 色天天综合色天天久久| 欧美性猛交xxxxxx富婆| 91精品国产91综合久久蜜臀| 日韩视频国产视频| 国产情人综合久久777777| 国产清纯在线一区二区www| 中文字幕一区二区视频| 亚洲精品成人精品456| 午夜欧美大尺度福利影院在线看| 日韩精品乱码免费| 国产专区欧美精品| bt7086福利一区国产| 欧美性大战久久| 91精品久久久久久久久99蜜臂| 久久综合国产精品| 国产精品不卡一区| 亚洲成人av一区| 国产自产v一区二区三区c| 成人h动漫精品一区二区| 欧美性生活影院| 欧美成人猛片aaaaaaa| 国产精品久久久久aaaa樱花| 亚洲综合精品自拍| 韩国欧美国产一区| 97精品视频在线观看自产线路二| 欧美日韩国产精选| 国产三级精品视频| 午夜视频久久久久久| 国产电影精品久久禁18| 欧美无乱码久久久免费午夜一区 | 中文字幕字幕中文在线中不卡视频| 亚洲综合色在线| 国产乱色国产精品免费视频| 91福利小视频| 国产人成亚洲第一网站在线播放| 亚洲一二三区视频在线观看| 国产精品自拍在线| 欧美日韩亚洲丝袜制服| 国产精品麻豆网站| 精品一区二区免费视频| 在线视频一区二区三区| 国产人久久人人人人爽| 日本中文字幕不卡| 色哟哟一区二区| 欧美激情综合网| 美腿丝袜一区二区三区| 在线观看欧美日本| 欧美精彩视频一区二区三区| 蜜桃视频在线观看一区二区| 色综合久久精品| 亚洲国产激情av| 久久99久久久久| 在线成人小视频| 亚洲最色的网站| 91丨国产丨九色丨pron| 国产日韩精品一区二区三区 | 亚洲精选一二三| 高清国产一区二区| 精品国产免费一区二区三区四区| 亚洲不卡av一区二区三区| 91免费国产在线| 国产精品久久久久三级| 国产美女主播视频一区| 精品欧美久久久| 蜜臀av一区二区在线免费观看| 欧美日韩免费视频| 亚洲国产成人tv| 欧美性猛片xxxx免费看久爱 | 首页国产欧美日韩丝袜| 色久综合一二码| 最近中文字幕一区二区三区| 成人性生交大片免费看视频在线| 久久久美女毛片| 韩日av一区二区| 久久先锋影音av鲁色资源网| 久久99热99| 久久久久综合网| 国产美女在线精品| 国产亚洲精品资源在线26u| 国产高清不卡二三区| 欧美激情一区二区三区全黄| 国产suv精品一区二区883| 国产女主播一区| 成人福利视频网站| 亚洲免费电影在线| 91老师片黄在线观看| 亚洲在线观看免费| 欧美日韩国产精品成人| 免费精品视频最新在线| 精品少妇一区二区三区日产乱码| 久久 天天综合| 国产欧美日韩精品一区| 成人av资源站| 一区二区欧美视频| 欧美老女人第四色| 麻豆成人综合网| 国产女主播视频一区二区| caoporn国产一区二区| 亚洲一区二区视频| 欧美一级黄色片| 国产不卡视频在线观看| 亚洲精品成人精品456| 欧美高清视频在线高清观看mv色露露十八| 日韩激情中文字幕| 久久蜜桃av一区精品变态类天堂| 不卡视频免费播放| 亚洲第一福利一区| 久久精品一区四区| 色哟哟亚洲精品| 九色综合国产一区二区三区|