From 49ddd8bf68c68b82478228ecee49b36fa538fab6 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 29 Dec 2018 09:56:36 +1100 Subject: [PATCH] Fix sorting of servers list not working --- src/LWeb.c | 25 ++++++++++++++++++------- src/LWeb.h | 8 ++++++-- src/LWidgets.c | 16 +++++++++------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/LWeb.c b/src/LWeb.c index aad60996e..73b6d89a9 100644 --- a/src/LWeb.c +++ b/src/LWeb.c @@ -314,13 +314,13 @@ struct FetchServerData FetchServerTask; static struct ServerInfo* curServer; static void ServerInfo_Init(struct ServerInfo* info) { - String_InitArray(info->Hash, info->_Buffer[0]); - String_InitArray(info->Name, info->_Buffer[1]); - String_InitArray(info->IP, info->_Buffer[2]); + String_InitArray(info->Hash, info->_hashBuffer); + String_InitArray(info->Name, info->_nameBuffer); + String_InitArray(info->IP, info->_ipBuffer); - String_InitArray(info->Mppass, info->_Buffer[3]); - String_InitArray(info->Software, info->_Buffer[4]); - String_InitArray(info->Country, info->_Buffer[5]); + String_InitArray(info->Mppass, info->_mppassBuffer); + String_InitArray(info->Software, info->_softBuffer); + String_InitArray(info->Country, info->_countryBuffer); info->Players = 0; info->MaxPlayers = 0; @@ -398,6 +398,7 @@ static void FetchServersTask_Handle(uint8_t* data, uint32_t len) { if (FetchServersTask.NumServers <= 0) return; FetchServersTask.Servers = Mem_Alloc(FetchServersTask.NumServers, sizeof(struct ServerInfo), "servers list"); + FetchServersTask.Orders = Mem_Alloc(FetchServersTask.NumServers, 2, "servers order"); /* -2 because servers is surrounded by a { */ curServer = FetchServersTask.Servers - 2; @@ -411,14 +412,24 @@ void FetchServersTask_Run(void) { LWebTask_Reset(&FetchServersTask.Base); Mem_Free(FetchServersTask.Servers); - FetchServersTask.Servers = NULL; + Mem_Free(FetchServersTask.Orders); + FetchServersTask.NumServers = 0; + FetchServersTask.Servers = NULL; + FetchServersTask.Orders = NULL; FetchServersTask.Base.Identifier = id; Http_AsyncGetData(&url, false, &id); FetchServersTask.Base.Handle = FetchServersTask_Handle; } +void FetchServersTask_ResetOrder(void) { + int i; + for (i = 0; i < FetchServersTask.NumServers; i++) { + FetchServersTask.Orders[i] = i; + } +} + /*########################################################################################################################* *-----------------------------------------------------CheckUpdateTask-----------------------------------------------------* diff --git a/src/LWeb.h b/src/LWeb.h index da8efee25..266652609 100644 --- a/src/LWeb.h +++ b/src/LWeb.h @@ -34,8 +34,10 @@ struct ServerInfo { String Hash, Name, IP, Mppass, Software, Country; int Players, MaxPlayers, Port, Uptime; bool Featured; - char _Buffer[6][STRING_SIZE]; - int _order; /* (internal) order in servers table */ + int _order; /* (internal) order in servers table after filtering */ + char _hashBuffer[32], _nameBuffer[STRING_SIZE]; + char _ipBuffer[16], _mppassBuffer[STRING_SIZE]; + char _countryBuffer[8], _softBuffer[STRING_SIZE]; }; struct LWebTask; @@ -79,9 +81,11 @@ void FetchServerTask_Run(const String* hash); extern struct FetchServersData { struct LWebTask Base; struct ServerInfo* Servers; /* List of all public servers on server list. */ + uint16_t* Orders; /* Order of each server (after sorting) */ int NumServers; /* Number of public servers. */ } FetchServersTask; void FetchServersTask_Run(void); +void FetchServersTask_ResetOrder(void); extern struct CheckUpdateData { diff --git a/src/LWidgets.c b/src/LWidgets.c index 52c0fa042..892fda139 100644 --- a/src/LWidgets.c +++ b/src/LWidgets.c @@ -1023,7 +1023,6 @@ void LTable_Reset(struct LTable* w) { w->SelectedHash->length = 0; w->Filter->length = 0; LTable_Sort(w); - LTable_ApplyFilter(w); } void LTable_ApplyFilter(struct LTable* w) { @@ -1032,7 +1031,7 @@ void LTable_ApplyFilter(struct LTable* w) { count = FetchServersTask.NumServers; for (i = 0, j = 0; i < count; i++) { if (String_CaselessContains(&FetchServersTask.Servers[i].Name, w->Filter)) { - FetchServersTask.Servers[j++]._order = i; + FetchServersTask.Servers[j++]._order = FetchServersTask.Orders[i]; } } @@ -1047,16 +1046,17 @@ void LTable_ApplyFilter(struct LTable* w) { static LTableSorter curSorter; static void LTable_QuickSort(int left, int right) { - struct ServerInfo* keys = FetchServersTask.Servers; struct ServerInfo key; + uint16_t* keys = FetchServersTask.Orders; uint16_t key; + struct ServerInfo* values = FetchServersTask.Servers; while (left < right) { int i = left, j = right; - struct ServerInfo* mid = &keys[(i + j) >> 1]; + struct ServerInfo* mid = &values[keys[(i + j) >> 1]]; /* partition the list */ while (i <= j) { - while (curSorter(mid, &keys[i]) < 0) i++; - while (curSorter(mid, &keys[j]) > 0) j--; + while (curSorter(mid, &values[keys[i]]) < 0) i++; + while (curSorter(mid, &values[keys[j]]) > 0) j--; QuickSort_Swap_Maybe(); } /* recurse into the smaller subset */ @@ -1066,10 +1066,12 @@ static void LTable_QuickSort(int left, int right) { void LTable_Sort(struct LTable* w) { if (!FetchServersTask.NumServers) return; + FetchServersTask_ResetOrder(); curSorter = w->Sorter; - //LTable_QuickSort(0, FetchServersTask.NumServers - 1); + LTable_QuickSort(0, FetchServersTask.NumServers - 1); LTable_ApplyFilter(w); + LTable_ShowSelected(w); } void LTable_ShowSelected(struct LTable* w) {