forked from DC-SWAT/DreamShell
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlist.h
More file actions
147 lines (108 loc) · 4.99 KB
/
Copy pathlist.h
File metadata and controls
147 lines (108 loc) · 4.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/**
* \file list.h
* \brief DreamShell lists
* \date 2007-2014
* \author SWAT www.dc-swat.ru
*/
#ifndef _DS_LIST_H
#define _DS_LIST_H
#include <kos.h>
#include <stdlib.h>
/**
* Определенные типы данных элемента, которые есть в DreamShell. Вы можете добавлять свои.
* Если вы используете список, где данные элемента не подходят не под один существующий тип,
* то можно использовать универсальный тип LIST_ITEM_USERDATA.
*/
typedef enum {
LIST_ITEM_USERDATA = 0,
LIST_ITEM_SDL_SURFACE,
LIST_ITEM_SDL_RWOPS,
LIST_ITEM_GUI_SURFACE,
LIST_ITEM_GUI_FONT,
LIST_ITEM_GUI_WIDGET,
LIST_ITEM_MODULE,
LIST_ITEM_APP,
LIST_ITEM_EVENT,
LIST_ITEM_THREAD,
LIST_ITEM_CMD,
LIST_ITEM_LUA_LIB,
LIST_ITEM_XML_NODE
} ListItemType;
/* Структура элемента списка */
typedef struct Item {
/* Точка входа SLIST, только для внутреннего использования. */
SLIST_ENTRY(Item) list;
/* Имя элемента списка */
const char *name;
/* ID элемента списка */
uint32 id;
/* Тип элемента списка */
ListItemType type;
/* Данные элемента списка */
void *data;
/* Размер данных (не обязателен) */
uint32 size;
} Item_t;
/**
* Определение типа для списка. Используется SLIST из библиотеки newlib
*/
typedef SLIST_HEAD(ItemList, Item) Item_list_t;
/**
* Определение типа функции, освобождающей память, занимаемую данными элемента.
*/
typedef void listFreeItemFunc(void *);
/**
* Создает список и возвращает указатель на него. Возвращает NULL в случае не удачи.
*/
Item_list_t *listMake();
#define listNew listMake;
/**
* Удаляет все элементы списка и сам список, аргумент ifree является функцией, для освобождения памяти, которую занимают данные элемента.
* В основном подходит функция free, она же используется там по умолчанию, если указать вместо аргумента ifree - NULL
*/
void listDestroy(Item_list_t *lst, listFreeItemFunc *ifree);
/**
* Получает ID последнего элемента (существующего или уже нет) из списка.
*/
uint32 listGetLastId(Item_list_t *lst);
/**
* Добавляет элемент в список и возвращает ссылку на него при успехе, а при ошибке возвращает NULL.
*/
Item_t *listAddItem(Item_list_t *lst, ListItemType type, const char *name, void *data, uint32 size);
/**
* Удаляет элемент из списка.
*/
void listRemoveItem(Item_list_t *lst, Item_t *i, listFreeItemFunc *ifree);
/**
* Ищет элемент в списке по его имени.
* Если элемент найден, возвращается ссылка на него, если нет, то возвращает NULL.
*/
Item_t *listGetItemByName(Item_list_t *lst, const char *name);
/**
* Ищет элемент в списке по типу.
* Если элемент найден, возвращается ссылка на него, если нет, то возвращает NULL.
*/
Item_t *listGetItemByType(Item_list_t *lst, ListItemType type);
/**
* Ищет элемент в списке по его имени и типу.
* Если элемент найден, возвращается ссылка на него, если нет, то возвращает NULL.
*/
Item_t *listGetItemByNameAndType(Item_list_t *lst, const char *name, ListItemType type);
/**
* Ищет элемент в списке по его ID.
* Если элемент найден, возвращается ссылка на него, если же нет, то возвращает NULL.
*/
Item_t *listGetItemById(Item_list_t *lst, uint32 id);
/**
* Возвращает первый элемент списка.
*/
Item_t *listGetItemFirst(Item_list_t *lst);
/**
* Возвращает следующий элемент списка, находящийся после элемента переданного аргументом i.
*/
Item_t *listGetItemNext(Item_t *i);
/**
* Примечание:
* Функции listGetItemFirst и listGetItemNext служат для создания циклической обработки списков.
*/
#endif