Еще хотелось бы добавить пару слов о принципе реализации списка пользователей.
Все делается очень просто.
Объявляем массив указателей на приведенную выше структуру:
static UDATA **u_list;
Также определяем переменную-счетчик пользователей
static uint u_count;Далее пишем функцию инициализации списка:
void ulist_init(void) {
u_count = 0; // обнуляем счетчик
// выделяем память под один элемент типа UDATA*, т.е. указатель.
// в большинстве случаев его размер равен 32-ум битам
u_list = (PUDATA)malloc(sizeof(UDATA*)*1);
memset(u_list,0,sizeof(UDATA*)*1); // заполняем память нулями
return;
}
Соответственно, функция освобождения памяти (деинициализации):
void ulist_free(void) {
uint i = 0;
for (i=0;i<u_count;i++) { // поочередно освобождаем память
if (u_list) free(u_list); // всех элементов списка (не забывая делать проверку на вшивость)
}
if (u_list) free(u_list); // освобождаем память самого списка
return;
}
Новый элемент добавляется путем добавления в конец списка указателя на новый элемент.
Для этого нам необходимо увеличить размер самого списка ровно на sizeof(UDATA*):
void ulist_add(char *name, char *lastmsg, char *channel, uint r_count) {
UDATA *pu = malloc(sizeof(UDATA)); // выделяем память под нового пользователя
// далее заполняем все необходимые поля структуры
strncpy(pu->u_name,name,sizeof(pu->u_name));
strncpy(pu->u_lastmsg,lastmsg,sizeof(pu->u_lastmsg));
strncpy(pu->u_channel,channel,sizeof(pu->u_channel));
pu->u_rcounter = r_count;
pu->u_thook = NULL;
// присваиваем последнему элементу списка адрес структуры,
// увеличивая после этого счетчик элементов
u_list[u_count++] = pu;
// увеличиваем размер списка. (new_size = sizeof(void*)*count)
u_list = (PUDATA)realloc(u_list,sizeof(UDATA*)*u_count);
return;
}
Еще нам понадобятся функции поиска и редактирования пользователя. Предлагаю написать их
самостоятельно, для того чтобы хоть чуточку поднапрячь ваш мозговой центр :)
Принцип этих функций довольно прост и очевиден.
Все же я поясню.. Для поиска пользователя по его имени просто пробегаем циклом по всем элементам
списка, сравнивая имя пользователя в текущем элементе с искомым именем. При совпадении, просто
возвращаем указатель на этот элемент.
С редактированием еще проще. Так же как и в функции поиска получаем нужный элемент списка и
устанавливаем новые значения всем элементам структуры.
Надеюсь, с этим каких бы то ни было трудностей не возникнет.
и еще, в конец главного модуля неплохо бы было добавить функцию деинициализации и освободить память под массив пользователей
// deinitialization entry point
int xchat_plugin_deinit (xchat_plugin *plugin_handle)
{
// releasing user list
ulist_free();
xchat_print (plugin_handle, "norepeat-plugin unloaded\n");
return 1;
}