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

📄 common.c

📁 一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上
💻 C
📖 第 1 页 / 共 3 页
字号:
	RECORDINDEX		*match_record, *next_match_record, *prev_match_record;

	tmp_local_list = *local_search_list;
	if( ( match_record = (RECORDINDEX *)SysLmalloc( sizeof( RECORDINDEX ) ) ) == NULL )
		return DB_ERROR;
	if( tmp_local_list == NULL )	//无记录
	{
		tmp_local_list = match_record;
		*local_search_list = tmp_local_list;
		tmp_local_list->next = NULL;
		tmp_local_list->prev = NULL;
		tmp_local_list->index = id;
		return DB_OK;
	}
	next_match_record = tmp_local_list;
	while( next_match_record != NULL )	//寻找局部查找表的尾记录
	{
		prev_match_record = next_match_record;
		next_match_record = prev_match_record->next;
	}
	prev_match_record->next = match_record;	//把新纪录添加到局部查找表上
	match_record->next = NULL;
	match_record->prev = prev_match_record;
	match_record->index = id;

	return DB_OK;
}

/**********************************************************************/
LOCALSEARCHLIST *SearchTimeRange( DBLACB *lacb, BYTE *data, FIELDINDEX *index_list, BYTE time_field )
{
	WORD			field_I_index, field_II_index;
	FIELDINDEX		*I_index_list, *II_index_list, *temp_II_index_list; 
	FIELDINDEX		*month_I_index_list = NULL, *week_II_index_list_1 = NULL, *week_II_index_list_2 = NULL, *special_II_index_list = NULL;
	RECORDDATA		*record_data_head, *record_head, *next_record_data;
	RECORDINDEX		*next_record_index;
	DBRECORDHEAD	*head_info;
	DWORD			tmp_id;
	WORD			i, j, k, count = 0;
	TIME_INDEX		com_time;
	TIME_INDEX		com_time_int, time;
	WORD			day_num;
	BYTE			search_range;
	DWORD			read_rv = DB_OK;

	search_range = (BYTE)( *(data) & 0x0f );
	data++;
	memcpy( &com_time, data, sizeof(TIME_INDEX) );
	Time2Int( &com_time, &com_time_int );

	I_index_list = index_list;
	GetTimeFieldIandIIIndex( data, &field_I_index, &field_II_index );
	I_index_list += field_I_index;	//确定一级索引表
	if( I_index_list->sub == NULL )
		goto  endrv;
	II_index_list = I_index_list->sub;
	II_index_list += field_II_index;//确定二级索引表

	switch( search_range )
	{
		case DAY_RANGE:
			if( II_index_list->num == 0 )
				goto  endrv;
			
			if( ( record_head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * II_index_list->num ) ) == NULL ) 
				return NULL;

			next_record_data = record_head;
			next_record_index = II_index_list->next;
			for( count = 0, i = 0; i < II_index_list->num; i++ )
			{
				//获取记录表上已有记录的同一字段值
				tmp_id = next_record_index->index;
				time = GetRecordInfo( tmp_id, lacb->gacb->PLInfo, &head_info, time_field );
				
				if( com_time_int.year == time.year )	//同年同月同日
				{
					count++;
					next_record_data->index = tmp_id;
					next_record_data->data = (BYTE *)head_info;
					next_record_data->datalen = head_info->size;
					next_record_data++;
				}else{
					SysLfree( head_info );
				}
				next_record_index = next_record_index->next;
			}
			goto	GetSearchList;
			
			break;
		case WEEK_RANGE:
			if( ( field_II_index + 1 ) < 7 )	//换月
			{
				//区分平年和闰年(2月)的换月
				if( ( field_I_index + 1 ) == 3 )		
				{
					month_I_index_list = I_index_list - 1;
					if( month_I_index_list->sub != NULL )	//下一个月有二级索引
					{
						week_II_index_list_1 = month_I_index_list->sub;
						if( com_time_int.year%4 == 0 )	//闰年(2月29天)
						{
							week_II_index_list_1 += ( 29 - ( 7 - ( field_II_index + 1 ) ) ); 
							week_II_index_list_2 = month_I_index_list->sub + 28;
						}else{					//平年(2月28天)
							week_II_index_list_1 += ( 28 - ( 7 - ( field_II_index + 1 ) ) ); 
							week_II_index_list_2 = month_I_index_list->sub + 27;
						}
					}
				}

				//处理换月后为小月(30天)
				if( ( ( field_I_index + 1 ) == 5 ) || ( ( field_I_index + 1 ) == 7 )
					|| ( ( field_I_index + 1 ) == 10 ) || ( ( field_I_index + 1 ) == 12 ) )
				{
					month_I_index_list = I_index_list - 1;
					if( month_I_index_list->sub != NULL )	//下一个月有二级索引
					{
						week_II_index_list_1 = month_I_index_list->sub;
						week_II_index_list_1 += ( 30 - ( 7 - ( field_II_index + 1 ) ) ); 
						week_II_index_list_2 = month_I_index_list->sub + 29;
					}
				}

				//处理换月后为大月(31天)
				if( ( ( field_I_index + 1 ) == 1 ) || ( ( field_I_index + 1 ) == 4 ) || ( ( field_I_index + 1 ) == 6 ) 
					|| ( ( field_I_index + 1 ) == 8 ) || ( ( field_I_index + 1 ) == 9 ) || ( ( field_I_index + 1 ) == 11 ) )
				{
					if( ( field_I_index + 1 ) == 1 )
					{
						month_I_index_list = index_list + 11;	//处理1月的换月(换年)
					}else{
						month_I_index_list = I_index_list - 1;
					}
					if( month_I_index_list->sub != NULL )	//下一个月有二级索引
					{
						week_II_index_list_1 = month_I_index_list->sub;
						week_II_index_list_1 += ( 31 - ( 7 - ( field_II_index + 1 ) ) ); 
						week_II_index_list_2 = month_I_index_list->sub + 30;
					}
				}
			}
				
			//计算记录个数
			temp_II_index_list = II_index_list;	//计算不用换月的记录			
			for( j = 0; ( j < ( field_II_index + 1 ) ) && ( j < 7 ); j ++ )
			{
				lacb->head->num = (WORD)( lacb->head->num + temp_II_index_list->num );
				temp_II_index_list--;
			}
			temp_II_index_list = week_II_index_list_2;	//计算换月后的记录
			if( temp_II_index_list != NULL )
			{
				do{
					lacb->head->num = (WORD)( lacb->head->num +temp_II_index_list->num );
					temp_II_index_list--;
				}
				while( ( temp_II_index_list + 1 ) != week_II_index_list_1 );
			}
			
			if( lacb->head->num == 0 )
				goto  endrv;
			if( ( record_head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * lacb->head->num ) ) == NULL ) 
				return NULL;

			count = 0;//计算实际符合搜索的记录
			next_record_data = record_head;
			temp_II_index_list = II_index_list;				
			for( j = 0; ( j < ( field_II_index + 1 ) ) && ( j < 7 ); j++ )	//链接当前月的记录
			{
				next_record_index = temp_II_index_list->next;
				for( i = 0; i < temp_II_index_list->num; i++ )
				{
					//获取记录表上已有记录的同一字段值
					tmp_id = next_record_index->index;
					time = GetRecordInfo( tmp_id, lacb->gacb->PLInfo, &head_info, time_field );

					if( com_time_int.year == time.year )	//同年同月同日
					{
						count++;
						next_record_data->index = tmp_id;
						next_record_data->data = (BYTE *)head_info;
						next_record_data->datalen = head_info->size;
						next_record_data++;
					}else{
						SysLfree( head_info );
					}
//					else if( count == lacb->head->num )
//					{
//						break;
//					}
					next_record_index = next_record_index->next;
				}
				temp_II_index_list--;
			}

			if( week_II_index_list_2 == NULL )
			{
				goto	GetSearchList;
			}else{
				temp_II_index_list = week_II_index_list_2;
			}

			do{		//链接换月的记录
				next_record_index = temp_II_index_list->next;
				for( i = 0; i < temp_II_index_list->num; i++ )
				{
					//获取记录表上已有记录的同一字段值
					tmp_id = next_record_index->index;
					time = GetRecordInfo( tmp_id, lacb->gacb->PLInfo, &head_info, time_field );
					
					if( ( field_I_index + 1 ) != 1 )
					{
						if( com_time_int.year == time.year )	//同年同月同日
						{
							count++;
							next_record_data->index = tmp_id;
							next_record_data->data = (BYTE *)head_info;
							next_record_data->datalen = head_info->size;
							next_record_data++;
						}else{
							SysLfree( head_info );
						}
//						else if( count == lacb->head->num )
//						{
//							break;
//						}
					}else{
						if( ( com_time_int.year - 1 ) == time.year )	//前一年
						{
							count++;
							next_record_data->index = tmp_id;
							next_record_data->data = (BYTE *)head_info;
							next_record_data->datalen = head_info->size;
							next_record_data++;
						}else{
							SysLfree( head_info );
						}
//						else if( ( ( com_time_int.year - 1 ) > time.year ) || ( count == lacb->head->num ) )
//						{
//							break;
//						}
					}
					next_record_index = next_record_index->next;
				}
				temp_II_index_list--;
			}while( ( temp_II_index_list + 1 ) != week_II_index_list_1 );

			goto	GetSearchList;
			
			break;
		case MONTH_RANGE:
			//区分平年和闰年(2月)的换月
			if( ( field_I_index + 1 ) == 3 ) 
			{
				if( ( com_time_int.year%4 == 0 ) && ( ( field_II_index + 1 ) != 1 ) )//闰年(2月29天)
				{
					month_I_index_list = I_index_list - 1;
					if( month_I_index_list->sub != NULL )	//下一个月有二级索引
					{
						week_II_index_list_1 = month_I_index_list->sub + ( field_II_index + 1 ) - 1; 
						week_II_index_list_2 = month_I_index_list->sub + 28;
					}
				}
				if( com_time_int.year%4 != 0 )//平年(2月28天)
				{
					month_I_index_list = I_index_list - 1;
					if( month_I_index_list->sub != NULL )	//下一个月有二级索引
					{
						week_II_index_list_1 = month_I_index_list->sub + ( field_II_index + 1 ) - 2; 
						week_II_index_list_2 = month_I_index_list->sub + 27;
					}
				}
			}

			if( ( ( field_I_index + 1 ) == 3 ) && ( ( field_II_index + 1 ) == 1 ) && (  com_time_int.year%4 != 0 ) )	//平年(2月28天)
			{
				if( ( I_index_list - 2 )->sub != NULL )
				{
					special_II_index_list = ( I_index_list - 2 )->sub + 30;
				}
				month_I_index_list = I_index_list - 1;
				if( month_I_index_list->sub != NULL )	//下一个月有二级索引
				{
					week_II_index_list_1 = month_I_index_list->sub; 
					week_II_index_list_2 = month_I_index_list->sub + 28;
				}
			}

			//处理换月后为小月(30天)
			if( ( ( field_I_index + 1 ) == 5 ) || ( ( field_I_index + 1 ) == 7 )
				|| ( ( field_I_index + 1 ) == 10 ) || ( ( field_I_index + 1 ) == 12 ) )
			{
				month_I_index_list = I_index_list - 1;
				if( month_I_index_list->sub != NULL )	//下一个月有二级索引
				{
					week_II_index_list_1 = month_I_index_list->sub + ( field_II_index + 1 ); 
					week_II_index_list_2 = month_I_index_list->sub + 29;
				}
			}

			//处理换月后为大月(31天)
			if( ( ( field_I_index + 1 ) == 1 ) || ( ( field_I_index + 1 ) == 4 ) || ( ( field_I_index + 1 ) == 6 ) 
				|| ( ( field_I_index + 1 ) == 8 ) || ( ( field_I_index + 1 ) == 9 ) || ( ( field_I_index + 1 ) == 11 ) )
			{
				if( ( field_I_index + 1 ) == 1 )
				{
					month_I_index_list = index_list + 11;	//处理1月的换月(换年)
				}else{
					month_I_index_list = I_index_list - 1;
				}
				if( month_I_index_list->sub != NULL )	//下一个月有二级索引
				{
					week_II_index_list_1 = month_I_index_list->sub + ( field_II_index + 1 ) + 1; 
					week_II_index_list_2 = month_I_index_list->sub + 30;
				}
			}
				
			//计算记录个数
			temp_II_index_list = II_index_list;	//计算不用换月的记录			
			for( j = 0; ( j < ( field_II_index + 1 ) ) && ( j < 30 ); j ++ )
			{
				lacb->head->num = (WORD)( lacb->head->num +temp_II_index_list->num );
				temp_II_index_list--;
			}
			temp_II_index_list = week_II_index_list_2;	//计算换月后的记录
			if( temp_II_index_list != NULL )
			{
				do{
					lacb->head->num = (WORD)( lacb->head->num +temp_II_index_list->num );
					temp_II_index_list--;
				}
				while( ( temp_II_index_list + 1 ) != week_II_index_list_1 );
			}
			temp_II_index_list = special_II_index_list;	//计算特殊的一个换月
			if( temp_II_index_list != NULL )
			{
				lacb->head->num = (WORD)( lacb->head->num + temp_II_index_list->num );
			}

			if( lacb->head->num == 0 )
				goto  endrv;

			if( ( record_head = (RECORDDATA *)SysLmalloc( sizeof(RECORDDATA) * lacb->head->num ) ) == NULL )
				return NULL;

			count = 0;//计算实际符合搜索的记录
			next_record_data = record_head;
			temp_II_index_list = II_index_list;				
			for( j = 0; ( j < ( field_II_index + 1 ) ) && ( j < 30 ); j++ )	//链接当前月的记录
			{
				next_record_index = temp_II_index_list->next;
				for( i = 0; i < temp_II_index_list->num; i++ )
				{
					//获取记录表上已有记录的同一字段值
					tmp_id = next_record_index->index;
					time = GetRecordInfo( tmp_id, lacb->gacb->PLInfo, &head_info, time_field );
						
					if( com_time_int.year == time.year )	//同年同月同日
					{
						count++;
						next_record_data->index = tmp_id;
						next_record_data->data = (BYTE *)head_info;
						next_record_data->datalen = head_info->size;
						next_record_data++;
					}else{
						SysLfree( head_info );
					}
//					else if(  count == lacb->head->num )
//					{
//						break;
//					}
					next_record_index = next_record_index->next;
				}
				temp_II_index_list--;
			}

			if( week_II_index_list_2 == NULL )
			{
				goto	GetSearchList;
			}else{
				temp_II_index_list = week_II_index_list_2;
			}

			do{		//链接换月的记录

⌨️ 快捷键说明

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