glist 기반 링크 데이터 구조 사용자 정의

5550 단어 Others
프로젝트 에 서 는 service 에서 발생 하 는 데이터 구 조 를 호출 자 에 게 제공 해 야 합 니 다.
그러나 데이터 구 조 는 노출 되 고 싶 지 않 기 때문에 필요 한 데이터 구조의 처 리 를 모두 API 로 밀봉 하여 호출 자 에 게 제공 해 야 한다.
 

=======================================================================
/* Define EXPORT_API */
#ifndef EXPORT_API
#define EXPORT_API __attribute__((visibility("default")))
#endif



EXPORT_API
int test_record_create(test_record_h *record)
{
	IFRET_VM(NULL == record, -1, "record is NULL");

	test_record *data = calloc(1, sizeof(test_record));
	IFRET_VM(NULL == data, -1, "calloc() Fail");
	data->date = NULL;
	data->key = NULL;
	data->value = NULL;
	*record = (test_record_h)data;

	return 0;
}

EXPORT_API
int test_record_destroy(test_record_h record)
{

	test_record *data = (test_record *)record;
	IFRET_VM(NULL == data, -1, "data is NULL");

	g_free(data->key);
	data->key = NULL;
	g_free(data->value);
	data->value = NULL;
	g_free(data->date);
	data->date = NULL;
	g_free(data);

	return 0;
}

EXPORT_API
int test_list_create(test_list_h *record_list)
{
	test_list *list_s = NULL;

	IFRET_VM(NULL == record_list, -1, "record_list is NULL");
	*record_list = NULL;

	list_s = calloc(1, sizeof(test_list));
	IFRET_VM(NULL == list_s, -1, "calloc() Fail");

	*record_list = (test_list_h)list_s;

	return 0;
}

EXPORT_API
int test_list_destroy(test_list_h record_list)
{

	test_list *s_list = NULL;
	GList *cursor = NULL;

	IFRET_VM(NULL == record_list, -1, "record_list is NULL");

	s_list = (test_list*)record_list;

	for (cursor = s_list->records; cursor; cursor = cursor->next)
		test_record_destroy((test_record_h)(cursor->data));

	g_list_free(s_list->records);
	g_free(s_list);

	return 0;
}

EXPORT_API
int test_record_set_key(test_record_h record, const char *key)
{

	test_record *data = (test_record *)record;
	IFRET_VM(NULL == data, -1, "data is NULL");
	IFRET_VM(NULL == key, -1, "key is NULL");

	data->key = g_strdup(key);

	return 0;
}




EXPORT_API
int test_record_get_key(test_record_h record, char **key)
{
	test_error_e 0 = 0;
	test_record *data = (test_record *)record;
	IFRET_VM(NULL == data, -1, "data is NULL");
	IFRET_VM(NULL == key, -1, "key is NULL");

	*key = data->key;

	return 0;
}



EXPORT_API
int test_list_add(test_list_h record_list, test_record_h record)
{
	test_list *s_list = NULL;
	test_record *s_record = NULL;

	IFRET_VM(NULL == record_list || NULL == record, -1, "record_list is NULL");
	s_list = (test_list*)record_list;
	s_record = (test_record*)record;


	s_list->records = g_list_append(s_list->records, s_record);

	if (s_list->count == 0) {
		s_list->cursor = s_list->records;
	}

	s_list->count++;

	return 0;
}

EXPORT_API
int test_list_remove(test_list_h record_list, test_record_h record)
{

	GList *cursor = NULL;
	test_list *s_list = NULL;
	test_record *s_record = NULL;

	IFRET_VM(NULL == record_list || NULL == record, -1, "record_list is NULL");
	s_list = (test_list*)record_list;
	s_record = (test_record*)record;


	for (cursor = s_list->records; cursor; cursor = cursor->next) {
		test_record *data = cursor->data;
		if (data == s_record) {
			s_list->count--;
			if (s_list->cursor == cursor) {
				s_list->cursor = cursor->next;
			}
			s_list->records = g_list_remove(s_list->records, s_record);
			return 0;
		}
	}

	return 0;
}


EXPORT_API
int test_list_get_record_count(test_list_h record_list, int *count)
{
	test_error_e 0 = 0;
	test_list *list_s = NULL;

	IFRET_VM(NULL == count, -1, "count  is NULL");
	*count = 0;

	IFRET_VM(NULL == record_list, -1, "record_list is NULL");
	list_s = (test_list*)record_list;

	*count = list_s->count;

	return 0;
}

EXPORT_API
int test_list_get_current_record(test_list_h record_list, test_record_h *record)
{
	test_error_e 0 = 0;
	test_list *list_s = NULL;

	IFRET_VM(NULL == record, -1, "record is NULL");
	*record = NULL;

	IFRET_VM(NULL == record_list || NULL == record, -1, "record_list is NULL");
	list_s = (test_list*)record_list;

	if (NULL == list_s->cursor) {
		*record = NULL;
		return -2;
	}

	*record = list_s->cursor->data;

	return 0;
}

EXPORT_API
int test_list_move_to_first(test_list_h record_list)
{
	test_error_e 0 = 0;
	test_list *list_s = NULL;

	IFRET_VM(NULL == record_list, -1, "record_list is NULL");
	list_s = (test_list*)record_list;

	list_s->cursor = list_s->records;
	if (NULL == list_s->cursor) {
		return -2;
	}

	return 0;
}

EXPORT_API
int test_list_move_to_last(test_list_h record_list)
{
	test_error_e 0 = 0;
	test_list *list_s;

	IFRET_VM(NULL == record_list, -1, "record_list is NULL");
	list_s = (test_list*)record_list;

	list_s->cursor = g_list_last(list_s->records);
	if (NULL == list_s->cursor) {
		return -2;
	}

	return 0;
}

static int __sc_list_move_cursor(test_list_h list, bool next)
{
	test_list *list_s;

	IFRET_VM(NULL == list, -1, "record_list is NULL");
	list_s = (test_list*)list;

	if (NULL == list_s->cursor)
		return -2;

	list_s->cursor = next ? list_s->cursor->next : list_s->cursor->prev ;

	if (NULL == list_s->cursor)
		return -2;

	return 0;
}

EXPORT_API
int test_list_move_to_next(test_list_h record_list)
{
	return __sc_list_move_cursor(record_list, true);

}

EXPORT_API
int test_list_move_to_prev(test_list_h record_list)
{
	return __sc_list_move_cursor(record_list, false);
}



좋은 웹페이지 즐겨찾기