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

📄 ntpaddb.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
		}
	}
	return searchlist;
}

/*************** Local Functions ********************/
//初始化一级索引表
void InitIndexList( void )
{
	WORD i;

	// 父目录一级索引表
	for( i = 0; i < 256; i++ )
	{
		NotepadParentField[i].next = NULL;
		NotepadParentField[i].prev = NULL;
		NotepadParentField[i].sub = NULL;
		NotepadParentField[i].index = i;		// 0 to 256
		NotepadParentField[i].num = 0;
	}

	// 目录/文件的id索引表
	for( i = 0; i < 256; i++ )
	{
		NotepadIDField[i].next = NULL;
		NotepadIDField[i].prev = NULL;
		NotepadIDField[i].sub = NULL;
		NotepadIDField[i].index = i;			// 0 to 256
		NotepadIDField[i].num = 0;
	}
	
	// 姓名一级索引表   //	for( i = 0; i < 26; i++ )
	for( i = 0; i < 27; i++ )
	{
		NotepadNameField_I[i].next = NULL;
		NotepadNameField_I[i].prev = NULL;
		NotepadNameField_I[i].sub = NULL;
		NotepadNameField_I[i].index = (WORD)(97+i);		// 'a' to 'z'
		NotepadNameField_I[i].num = 0;
	}

	// 创建时间一级索引表
	for( i = 0; i < 12; i++ )
	{
		NotepadModifyTimeField_I[i].next = NULL;
		NotepadModifyTimeField_I[i].prev = NULL;
		NotepadModifyTimeField_I[i].sub = NULL;
		NotepadModifyTimeField_I[i].index = i;	// 0 to 11 
		NotepadModifyTimeField_I[i].num = 0;
	}
}

/**********************************************************************/
// 将字段值加入到字段索引表	
DWORD Add2FieldIndexTbl( DBGACB *gacb, BYTE field, BYTE *value, DWORD id )
{
	FIELDINDEXLIST		*list;
	BYTE				*temp;							//指向字段的暂存指针
	BYTE				i;
	BYTE				PY_num = 0;						//存放汉字的多音字的个数
	FIELDINDEX			*I_index_list, *II_index_list;	//一、二级索引表
	WORD				field_I_index[PY_MAX_NUM], field_II_index[PY_MAX_NUM];//字段一二级索引值
	RECORDINDEX			*new_record_head;				//新纪录的地址

	if( value == NULL )
		return DB_ERROR;

	temp = value;
	list = gacb->FList;
	I_index_list = list[field].head;	//链接一级索引表

	switch( field )
	{
		case NOTEPAD_PARENT_FIELD: // 父目录字段
			if( strlen(value) == 0 )
			{
				*field_I_index = 0;
			}else{
				*field_I_index = *value;
			}
			I_index_list += ( *field_I_index );		//确定一级索引表

			new_record_head = Add2RecordIndexTbl( I_index_list, id );
			Add2RecordIndex( gacb->RFList, id, new_record_head );// 将字段索引加入到记录字段表
			break;
		case NOTEPAD_ID_FIELD: // 目录/文件的id字段
			if( ( *value < 0 ) || ( *value > 255 ) )
				return DB_ERROR;
			*field_I_index = *value;
			I_index_list += ( *field_I_index );//确定一级索引表

			new_record_head = Add2RecordIndexTbl( I_index_list, id );
			Add2RecordIndex( gacb->RFList, id, new_record_head );// 将字段索引加入到记录字段表
			break;
		case NOTEPAD_NAME_FIELD:	// 目录/文件的名称字段
			GetNameFieldIandIIIndex( temp, field_I_index, field_II_index, &PY_num);	//将字段值转化为索引
			for( i = 0; i <= PY_num; i++ )			//把单音字/多音字逐个添加到字段索引表中
			{
				I_index_list += ( field_I_index[i] - 'a' );
				II_index_list = CreateIIIndexList( I_index_list, field );// 新建姓名二级索引表
				II_index_list += ( field_II_index[i] );//确定二级索引表
				
				new_record_head = Add2RecordIndexTbl( II_index_list, id );
				Add2RecordIndex( gacb->RFList, id, new_record_head );// 将字段索引加入到记录字段表
					 
				I_index_list = list[field].head;
//				field_I_index++;
//				field_II_index++;
			}
//			field_I_index -= (PY_num+1);
//			field_II_index -= (PY_num+1);
			break;
		case NOTEPAD_MODIFY_TIME_FIELD: // 修改时间字段
			GetTimeFieldIandIIIndex( temp, field_I_index, field_II_index );	//将字段值转化为索引
			
			I_index_list += ( *field_I_index );//确定一级索引表
			II_index_list = CreateIIIndexList( I_index_list, field );// 新建二级索引表
			II_index_list += ( *field_II_index );//确定二级索引表

			new_record_head = Add2RecordIndexTbl( II_index_list, id );
			Add2RecordIndex( gacb->RFList, id, new_record_head );// 将字段索引加入到记录字段表
			break;
		default:
			break;
	}

	return DB_OK;
}

/**********************************************************************/
//创建新的二级索引表
FIELDINDEX *CreateIIIndexList( FIELDINDEX *I_index_list, BYTE field )
{
	BYTE	k;
	FIELDINDEX *II_index_list;

	II_index_list = I_index_list->sub;		//链接二级索引表
	if( II_index_list == NULL )	 //二级索引表为空,则动态申请二级索引表
	{
		switch( field )
		{		
			case NOTEPAD_NAME_FIELD:		// 目录/文件的名称字段
				I_index_list->num = 54;		//更新一级索引表的索引数
				break;
			case NOTEPAD_MODIFY_TIME_FIELD: // 修改时间字段
				I_index_list->num = 31;		//更新一级索引表的索引数
				break;
			default:
				return NULL;
		}

		if( ( II_index_list = (FIELDINDEX *)SysLmalloc( sizeof(FIELDINDEX) * ( I_index_list->num ) ) ) == NULL )
			return NULL;
		I_index_list->sub = II_index_list;	//链接二级索引表
		
		// 新建二级索引表
		for( k = 0; k < I_index_list->num; k++ )
		{
			II_index_list[k].next = NULL;		
			II_index_list[k].prev = NULL;
			II_index_list[k].sub = NULL;
			II_index_list[k].index = k;	
			II_index_list[k].num = 0;
		}
	}
	return ( II_index_list );
}

/**********************************************************************/
//分开查找表中的目录和文件
WORD DetachListDirandFile( WORD count, RECORDDATA *record_head, LOCALSEARCHLIST *head )
{
	RECORDDATA		*record_data_head, *next_record_head, *next_record_data;
	DBRECORDHEAD	*head_info;
	BYTE			*record_data, *field_value;
#ifdef SIM_ON_PC
	WORD			*field_head;
#else
	WORD			field_head;
#endif
	WORD			i;

	if( ( record_data_head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * count ) ) == NULL ) 
		return DB_ERROR;
	next_record_head = record_data_head;

	next_record_data = record_head;
	//把目录和文件分开(现放目录,后放文件)
	for( i = 0; i < count; i++ )	//放目录
	{
		head_info = (DBRECORDHEAD *)(next_record_data->data);
		record_data = (BYTE *)(&head_info->data);
#ifdef SIM_ON_PC
		field_head = (WORD *)record_data;
		field_value =  record_data + field_head[NOTEPAD_ID_FIELD];
#else
		ByteReversal( &field_head, record_data+(NOTEPAD_ID_FIELD*sizeof(WORD)) );
		field_value =  record_data + field_head;
#endif
		if( *field_value != 0 )	
		{
			memcpy( next_record_head, next_record_data, sizeof(RECORDDATA) );
			next_record_head++;
		}
		next_record_data++;
	}

	next_record_data = record_head;
	for( i = 0; i < count; i++ )	//放文件
	{
		head_info = (DBRECORDHEAD *)(next_record_data->data);
		record_data = (BYTE *)(&head_info->data);
#ifdef SIM_ON_PC
		field_head = (WORD *)record_data;
		field_value =  record_data + field_head[NOTEPAD_ID_FIELD];
#else
		ByteReversal( &field_head, record_data+(NOTEPAD_ID_FIELD*sizeof(WORD)) );
		field_value =  record_data + field_head;
#endif

		if( *field_value == 0 )
		{
			memcpy( next_record_head, next_record_data, sizeof(RECORDDATA) );
			next_record_head++;
		}
		next_record_data++;
	}

	SysLfree( record_head );
	head->num = count;
	head->head = record_data_head;

	return DB_OK;
}

/**********************************************************************/
//获得父目录的各级记录
DWORD GetParentRecord( DBLACB *lacb, LOCALSEARCHLIST *head, FIELDINDEX *I_index_list, BYTE *data )
{
	WORD			i, j, k, count;	
	WORD			*field_I_index, *temp_field_I_index;
	BYTE			*temp, dir[50];	//dir为目录路径的深度
	BYTE			*record, *record_data, *field_value;
	FIELDINDEX		*temp_index_list;
	RECORDINDEX		*next_record_head;
	RECORDDATA		*record_data_index, *next_record_index;
	DBRECORDHEAD	*head_info;
	DWORD			tmp_id, read_rv;
#ifdef SIM_ON_PC
	WORD			*field_head;
#else
	WORD			field_head;
#endif
	CHAR			rv;
	
	temp = data;
	count = (WORD)strlen(temp);	//计算父目录的级数
	if( count == 0 )		//父目录是根目录
		return DB_OK;		//搜索获得的列表长度为0,表示是根目录

	//非根目录
	//申请索引号
	if( ( field_I_index = (WORD *)SysLmalloc( sizeof(WORD) * count ) ) == NULL )
	{
		SysLfree( head );
		return DB_ERROR;
	}
	temp_field_I_index = field_I_index;

	//申请搜索列表
	if( ( record_data_index = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * count ) ) == NULL )
	{
		SysLfree( head );
		SysLfree( field_I_index );
		return DB_ERROR;
	}
	next_record_index = record_data_index;

	//获得父目录的各级id号
	for( i = 0; i < count; i++ )	
	{
		*temp_field_I_index = *temp;
		temp_field_I_index++;
		temp++;
	}
	temp_field_I_index = field_I_index;

	for( i = 0; i < count; i++ )	//获得父目录的记录列表
	{
		temp_index_list = I_index_list + ( *temp_field_I_index );	//确定一级索引
		if( temp_index_list->num == 0 )
		{
			SysLfree( head );
			SysLfree( field_I_index );
			SysLfree( record_data_index );
			return DB_ERROR;
		}

		//获取记录表上已有记录的同一字段值
		next_record_head = temp_index_list->next;
		for( j = 0; j < temp_index_list->num; j++ )
		{
			tmp_id = next_record_head->index;
			read_rv = GlobalReadRecord( lacb->gacb->PLInfo, tmp_id, &record );
			if( read_rv != DB_OK )
			{
				SysLfree( head );
				SysLfree( field_I_index );
				return DB_ERROR;
			}
			head_info = (DBRECORDHEAD *)record;
			record_data = (BYTE *)(&head_info->data);
#ifdef SIM_ON_PC
			field_head = (WORD *)record_data;
			if( field_head[NOTEPAD_PARENT_FIELD] != 0 )	// 字段有字段值
			{
				field_value = record_data + field_head[NOTEPAD_PARENT_FIELD];
#else
			ByteReversal( &field_head, record_data+(NOTEPAD_PARENT_FIELD*sizeof(WORD)) );
			if( field_head != 0 )	// 字段有字段值
			{
				field_value = record_data + field_head;
#endif
				//获得给定父目录中某级的父目录
				k = 0;
				temp = data;
				while( k != i )		
				{
					dir[k] = *temp;
					k++;
					temp++;
				}
				dir[k] = '\0';

				rv = strcmp( field_value, dir );	//比较父目录
				if( rv == 0 )	//找到此目录
				{
					next_record_index->index = tmp_id;
					next_record_index->data = record;
					next_record_index->datalen = head_info->size;
					next_record_index++;
					break;
				}else{
					SysLfree(record);
				}
			}else{
				SysLfree( record );
			}
			next_record_head = next_record_head->next;
//			SysLfree( record );
		}
		if( j == temp_index_list->num )	//给定的父目录中有无效的目录号
		{
			SysLfree( head );
			SysLfree( field_I_index );
			SysLfree( record_data_index );
			return DB_ERROR;
		}
		temp_field_I_index++;
	}

	head->head = record_data_index;
	head->num = count;
	return	DB_OK;
}

⌨️ 快捷键说明

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