From 6ede7a5cb09c8a5c64c050e34a327c0e045ea768 Mon Sep 17 00:00:00 2001 From: Stu Black Date: Fri, 3 Oct 2025 00:43:56 -0400 Subject: [PATCH] Reimplement WINGs array.c in Rust. This is another utility that should not be used in any new (Rust) code. (We should prefer Vec or something similar.) This should be removed once dependents are ported to Rust. --- WINGs/Makefile.am | 1 - WINGs/WINGs/WUtil.h | 22 +-- WINGs/array.c | 363 ------------------------------------------- WINGs/handlers.c | 6 +- WINGs/selection.c | 4 +- src/dialog.c | 4 +- src/event.c | 4 +- src/switchpanel.c | 2 +- src/winmenu.c | 2 +- util/Makefile.am | 35 ++++- wutil-rs/Makefile.am | 1 + wutil-rs/src/lib.rs | 1 + 12 files changed, 49 insertions(+), 396 deletions(-) delete mode 100644 WINGs/array.c diff --git a/WINGs/Makefile.am b/WINGs/Makefile.am index 14fbeccc..308f140c 100644 --- a/WINGs/Makefile.am +++ b/WINGs/Makefile.am @@ -64,7 +64,6 @@ libWINGs_la_SOURCES = \ wwindow.c libWUtil_la_SOURCES = \ - array.c \ bagtree.c \ data.c \ error.c \ diff --git a/WINGs/WINGs/WUtil.h b/WINGs/WINGs/WUtil.h index bf78fa40..b392b305 100644 --- a/WINGs/WINGs/WUtil.h +++ b/WINGs/WINGs/WUtil.h @@ -396,7 +396,7 @@ extern const WMHashTableCallbacks WMStringPointerHashCallbacks; /* keys are strings, but they are not copied */ -/* ---[ WINGs/array.c ]--------------------------------------------------- */ +/* ---[ wutil-rs/src/array.rs ]--------------------------------------------------- */ /* * WMArray use an array to store the elements. @@ -418,29 +418,22 @@ WMArray* WMCreateArrayWithDestructor(int initialSize, WMFreeDataProc *destructor WMArray* WMCreateArrayWithArray(WMArray *array); -#define WMDuplicateArray(array) WMCreateArrayWithArray(array) - void WMEmptyArray(WMArray *array); void WMFreeArray(WMArray *array); int WMGetArrayItemCount(WMArray *array); -/* appends other to array. other remains unchanged */ -void WMAppendArray(WMArray *array, WMArray *other); - /* add will place the element at the end of the array */ void WMAddToArray(WMArray *array, void *item); /* insert will increment the index of elements after it by 1 */ void WMInsertInArray(WMArray *array, int index, void *item); -/* replace and set will return the old item WITHOUT calling the +/* set returns the old item WITHOUT calling the * destructor on it even if its available. Free the returned item yourself. */ -void* WMReplaceInArray(WMArray *array, int index, void *item); - -#define WMSetInArray(array, index, item) WMReplaceInArray(array, index, item) +void* WMSetInArray(WMArray *array, int index, void *item); /* delete and remove will remove the elements and cause the elements * after them to decrement their indexes by 1. Also will call the @@ -448,20 +441,21 @@ void* WMReplaceInArray(WMArray *array, int index, void *item); */ int WMDeleteFromArray(WMArray *array, int index); -#define WMRemoveFromArray(array, item) WMRemoveFromArrayMatching(array, NULL, item) +int WMRemoveFromArray(WMArray *array, void *item); int WMRemoveFromArrayMatching(WMArray *array, WMMatchDataProc *match, void *cdata); void* WMGetFromArray(WMArray *array, int index); -#define WMGetFirstInArray(array, item) WMFindInArray(array, NULL, item) - /* pop will return the last element from the array, also removing it * from the array. The destructor is NOT called, even if available. * Free the returned element if needed by yourself */ void* WMPopFromArray(WMArray *array); +/* Like WMFindInArray(array, NULL, item) */ +int WMGetFirstInArray(WMArray *array, void *item); + int WMFindInArray(WMArray *array, WMMatchDataProc *match, void *cdata); int WMCountInArray(WMArray *array, void *item); @@ -475,8 +469,6 @@ void WMSortArray(WMArray *array, WMCompareDataProc *comparer); void WMMapArray(WMArray *array, void (*function)(void*, void*), void *data); -WMArray* WMGetSubarrayWithRange(WMArray* array, WMRange aRange); - void* WMArrayFirst(WMArray *array, WMArrayIterator *iter); void* WMArrayLast(WMArray *array, WMArrayIterator *iter); diff --git a/WINGs/array.c b/WINGs/array.c deleted file mode 100644 index df52358d..00000000 --- a/WINGs/array.c +++ /dev/null @@ -1,363 +0,0 @@ -/* - * Dynamically Resized Array - * - * Authors: Alfredo K. Kojima - * Dan Pascu - * - * This code is released to the Public Domain, but - * proper credit is always appreciated :) - */ - -#include -#include - -#include "WUtil.h" - -#define INITIAL_SIZE 8 -#define RESIZE_INCREMENT 8 - -typedef struct W_Array { - void **items; /* the array data */ - int itemCount; /* # of items in array */ - int allocSize; /* allocated size of array */ - WMFreeDataProc *destructor; /* the destructor to free elements */ -} W_Array; - -WMArray *WMCreateArray(int initialSize) -{ - return WMCreateArrayWithDestructor(initialSize, NULL); -} - -WMArray *WMCreateArrayWithDestructor(int initialSize, WMFreeDataProc * destructor) -{ - WMArray *array; - - array = wmalloc(sizeof(WMArray)); - - if (initialSize <= 0) { - initialSize = INITIAL_SIZE; - } - - array->items = wmalloc(sizeof(void *) * initialSize); - - array->itemCount = 0; - array->allocSize = initialSize; - array->destructor = destructor; - - return array; -} - -WMArray *WMCreateArrayWithArray(WMArray * array) -{ - WMArray *newArray; - - newArray = wmalloc(sizeof(WMArray)); - - newArray->items = wmalloc(sizeof(void *) * array->allocSize); - memcpy(newArray->items, array->items, sizeof(void *) * array->itemCount); - - newArray->itemCount = array->itemCount; - newArray->allocSize = array->allocSize; - newArray->destructor = NULL; - - return newArray; -} - -void WMEmptyArray(WMArray * array) -{ - if (array->destructor) { - while (array->itemCount > 0) { - array->itemCount--; - array->destructor(array->items[array->itemCount]); - } - } - /*memset(array->items, 0, array->itemCount * sizeof(void*)); */ - array->itemCount = 0; -} - -void WMFreeArray(WMArray * array) -{ - if (array == NULL) - return; - - WMEmptyArray(array); - wfree(array->items); - wfree(array); -} - -int WMGetArrayItemCount(WMArray * array) -{ - if (array == NULL) - return 0; - - return array->itemCount; -} - -void WMAppendArray(WMArray * array, WMArray * other) -{ - if (array == NULL || other == NULL) - return; - - if (other->itemCount == 0) - return; - - if (array->itemCount + other->itemCount > array->allocSize) { - array->allocSize += other->allocSize; - array->items = wrealloc(array->items, sizeof(void *) * array->allocSize); - } - - memcpy(array->items + array->itemCount, other->items, sizeof(void *) * other->itemCount); - array->itemCount += other->itemCount; -} - -void WMAddToArray(WMArray * array, void *item) -{ - if (array == NULL) - return; - - if (array->itemCount >= array->allocSize) { - array->allocSize += RESIZE_INCREMENT; - array->items = wrealloc(array->items, sizeof(void *) * array->allocSize); - } - array->items[array->itemCount] = item; - - array->itemCount++; -} - -void WMInsertInArray(WMArray * array, int index, void *item) -{ - if (array == NULL) - return; - - wassertr(index >= 0 && index <= array->itemCount); - - if (array->itemCount >= array->allocSize) { - array->allocSize += RESIZE_INCREMENT; - array->items = wrealloc(array->items, sizeof(void *) * array->allocSize); - } - if (index < array->itemCount) { - memmove(array->items + index + 1, array->items + index, - sizeof(void *) * (array->itemCount - index)); - } - array->items[index] = item; - - array->itemCount++; -} - -void *WMReplaceInArray(WMArray * array, int index, void *item) -{ - void *old; - - if (array == NULL) - return NULL; - - wassertrv(index >= 0 && index <= array->itemCount, NULL); - - /* is it really useful to perform append if index == array->itemCount ? -Dan */ - if (index == array->itemCount) { - WMAddToArray(array, item); - return NULL; - } - - old = array->items[index]; - array->items[index] = item; - - return old; -} - -int WMDeleteFromArray(WMArray * array, int index) -{ - if (array == NULL) - return 0; - - wassertrv(index >= 0 && index < array->itemCount, 0); - - if (array->destructor) { - array->destructor(array->items[index]); - } - - if (index < array->itemCount - 1) { - memmove(array->items + index, array->items + index + 1, - sizeof(void *) * (array->itemCount - index - 1)); - } - - array->itemCount--; - - return 1; -} - -int WMRemoveFromArrayMatching(WMArray * array, WMMatchDataProc * match, void *cdata) -{ - int i; - - if (array == NULL) - return 1; - - if (match != NULL) { - for (i = 0; i < array->itemCount; i++) { - if ((*match) (array->items[i], cdata)) { - WMDeleteFromArray(array, i); - return 1; - } - } - } else { - for (i = 0; i < array->itemCount; i++) { - if (array->items[i] == cdata) { - WMDeleteFromArray(array, i); - return 1; - } - } - } - - return 0; -} - -void *WMGetFromArray(WMArray * array, int index) -{ - if (index < 0 || array == NULL || index >= array->itemCount) - return NULL; - - return array->items[index]; -} - -void *WMPopFromArray(WMArray * array) -{ - if (array == NULL || array->itemCount <= 0) - return NULL; - - array->itemCount--; - - return array->items[array->itemCount]; -} - -int WMFindInArray(WMArray * array, WMMatchDataProc * match, void *cdata) -{ - int i; - - if (array == NULL) - return WANotFound; - - if (match != NULL) { - for (i = 0; i < array->itemCount; i++) { - if ((*match) (array->items[i], cdata)) - return i; - } - } else { - for (i = 0; i < array->itemCount; i++) { - if (array->items[i] == cdata) - return i; - } - } - - return WANotFound; -} - -int WMCountInArray(WMArray * array, void *item) -{ - int i, count; - - if (array == NULL) - return 0; - - for (i = 0, count = 0; i < array->itemCount; i++) { - if (array->items[i] == item) - count++; - } - - return count; -} - -void WMSortArray(WMArray * array, WMCompareDataProc * comparer) -{ - if (array == NULL) - return; - - if (array->itemCount > 1) { /* Don't sort empty or single element arrays */ - qsort(array->items, array->itemCount, sizeof(void *), comparer); - } -} - -void WMMapArray(WMArray * array, void (*function) (void *, void *), void *data) -{ - int i; - - if (array == NULL) - return; - - for (i = 0; i < array->itemCount; i++) { - (*function) (array->items[i], data); - } -} - -WMArray *WMGetSubarrayWithRange(WMArray * array, WMRange aRange) -{ - WMArray *newArray; - - if (aRange.count <= 0 || array == NULL) - return WMCreateArray(0); - - if (aRange.position < 0) - aRange.position = 0; - if (aRange.position >= array->itemCount) - aRange.position = array->itemCount - 1; - if (aRange.position + aRange.count > array->itemCount) - aRange.count = array->itemCount - aRange.position; - - newArray = WMCreateArray(aRange.count); - memcpy(newArray->items, array->items + aRange.position, sizeof(void *) * aRange.count); - newArray->itemCount = aRange.count; - - return newArray; -} - -void *WMArrayFirst(WMArray * array, WMArrayIterator * iter) -{ - if (array == NULL || array->itemCount == 0) { - *iter = WANotFound; - return NULL; - } else { - *iter = 0; - return array->items[0]; - } -} - -void *WMArrayLast(WMArray * array, WMArrayIterator * iter) -{ - if (array == NULL || array->itemCount == 0) { - *iter = WANotFound; - return NULL; - } else { - *iter = array->itemCount - 1; - return array->items[*iter]; - } -} - -void *WMArrayNext(WMArray * array, WMArrayIterator * iter) -{ - if (array == NULL) { - *iter = WANotFound; - return NULL; - } - - if (*iter >= 0 && *iter < array->itemCount - 1) { - return array->items[++(*iter)]; - } else { - *iter = WANotFound; - return NULL; - } -} - -void *WMArrayPrevious(WMArray * array, WMArrayIterator * iter) -{ - if (array == NULL) { - *iter = WANotFound; - return NULL; - } - - if (*iter > 0 && *iter < array->itemCount) { - return array->items[--(*iter)]; - } else { - *iter = WANotFound; - return NULL; - } -} diff --git a/WINGs/handlers.c b/WINGs/handlers.c index 88682867..b2872083 100644 --- a/WINGs/handlers.c +++ b/WINGs/handlers.c @@ -279,7 +279,7 @@ Bool W_CheckIdleHandlers(void) return (idleHandler != NULL && WMGetArrayItemCount(idleHandler) > 0); } - handlerCopy = WMDuplicateArray(idleHandler); + handlerCopy = WMCreateArrayWithArray(idleHandler); WM_ITERATE_ARRAY(handlerCopy, handler, iter) { /* check if the handler still exist or was removed by a callback */ @@ -429,7 +429,7 @@ Bool W_HandleInputEvents(Bool waitForInput, int inputfd) count = poll(fds, nfds + extrafd, timeout); if (count > 0 && nfds > 0) { - WMArray *handlerCopy = WMDuplicateArray(inputHandler); + WMArray *handlerCopy = WMCreateArrayWithArray(inputHandler); int mask; /* use WM_ITERATE_ARRAY() here */ @@ -527,7 +527,7 @@ Bool W_HandleInputEvents(Bool waitForInput, int inputfd) count = select(1 + maxfd, &rset, &wset, &eset, timeoutPtr); if (count > 0 && nfds > 0) { - WMArray *handlerCopy = WMDuplicateArray(inputHandler); + WMArray *handlerCopy = WMCreateArrayWithArray(inputHandler); int mask; /* use WM_ITERATE_ARRAY() here */ diff --git a/WINGs/selection.c b/WINGs/selection.c index 5d5221b8..0d1bc59c 100644 --- a/WINGs/selection.c +++ b/WINGs/selection.c @@ -237,7 +237,7 @@ static void handleRequestEvent(XEvent * event) } /* delete handlers */ - copy = WMDuplicateArray(selHandlers); + copy = WMCreateArrayWithArray(selHandlers); WM_ITERATE_ARRAY(copy, handler, iter) { if (handler && handler->flags.delete_pending) { WMDeleteSelectionHandler(handler->view, handler->selection, handler->timestamp); @@ -300,7 +300,7 @@ static void handleNotifyEvent(XEvent * event) } /* delete callbacks */ - copy = WMDuplicateArray(selCallbacks); + copy = WMCreateArrayWithArray(selCallbacks); WM_ITERATE_ARRAY(copy, handler, iter) { if (handler && handler->flags.delete_pending) { WMDeleteSelectionCallback(handler->view, handler->selection, handler->timestamp); diff --git a/src/dialog.c b/src/dialog.c index 391dda23..a594abcf 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -367,7 +367,7 @@ static void handleHistoryKeyPress(XEvent * event, void *clientData) case XK_Up: if (p->histpos < WMGetArrayItemCount(p->history) - 1) { if (p->histpos == 0) - wfree(WMReplaceInArray(p->history, 0, WMGetTextFieldText(p->panel->text))); + wfree(WMSetInArray(p->history, 0, WMGetTextFieldText(p->panel->text))); p->histpos++; WMSetTextFieldText(p->panel->text, WMGetFromArray(p->history, p->histpos)); } @@ -468,7 +468,7 @@ int wAdvancedInputDialog(WScreen *scr, const char *title, const char *message, c if (p->panel->result == WAPRDefault) { result = WMGetTextFieldText(p->panel->text); - wfree(WMReplaceInArray(p->history, 0, wstrdup(result))); + wfree(WMSetInArray(p->history, 0, wstrdup(result))); SaveHistory(p->history, filename); } else result = NULL; diff --git a/src/event.c b/src/event.c index 7356a1a2..48666868 100644 --- a/src/event.c +++ b/src/event.c @@ -1796,7 +1796,7 @@ static void handleKeyPress(XEvent * event) } if (wwin->flags.selected && scr->selected_windows) { - scr->shortcutWindows[widx] = WMDuplicateArray(scr->selected_windows); + scr->shortcutWindows[widx] = WMCreateArrayWithArray(scr->selected_windows); /*WMRemoveFromArray(scr->shortcutWindows[index], wwin); WMInsertInArray(scr->shortcutWindows[index], 0, wwin); */ } else { @@ -1816,7 +1816,7 @@ static void handleKeyPress(XEvent * event) if (scr->shortcutWindows[widx]) { WMFreeArray(scr->shortcutWindows[widx]); } - scr->shortcutWindows[widx] = WMDuplicateArray(scr->selected_windows); + scr->shortcutWindows[widx] = WMCreateArrayWithArray(scr->selected_windows); } } diff --git a/src/switchpanel.c b/src/switchpanel.c index cb6cda10..d5260b5e 100644 --- a/src/switchpanel.c +++ b/src/switchpanel.c @@ -132,7 +132,7 @@ static void changeImage(WSwitchPanel *panel, int idecks, int selected, Bool dim, if (flags == desired && !force) return; - WMReplaceInArray(panel->flags, idecks, (void *) (uintptr_t) desired); + WMSetInArray(panel->flags, idecks, (void *) (uintptr_t) desired); if (!panel->bg && !panel->tile && !selected) WMSetFrameRelief(icon, WRFlat); diff --git a/src/winmenu.c b/src/winmenu.c index 422e0663..3680aa79 100644 --- a/src/winmenu.c +++ b/src/winmenu.c @@ -346,7 +346,7 @@ static void makeShortcutCommand(WMenu * menu, WMenuEntry * entry) } if (wwin->flags.selected && scr->selected_windows) { - scr->shortcutWindows[index] = WMDuplicateArray(scr->selected_windows); + scr->shortcutWindows[index] = WMCreateArrayWithArray(scr->selected_windows); /*WMRemoveFromArray(scr->shortcutWindows[index], wwin); WMInsertInArray(scr->shortcutWindows[index], 0, wwin); */ } else { diff --git a/util/Makefile.am b/util/Makefile.am index 0c148702..1fe28f89 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -18,31 +18,50 @@ AM_CPPFLAGS = \ liblist= @LIBRARY_SEARCH_PATH@ @INTLIBS@ -wdwrite_LDADD = $(top_builddir)/WINGs/libWUtil.la $(liblist) +wdwrite_LDADD = \ + $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wutil-rs/target/debug/libwutil_rs.a \ + $(liblist) -wdread_LDADD = $(top_builddir)/WINGs/libWUtil.la $(liblist) +wdread_LDADD = \ + $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wutil-rs/target/debug/libwutil_rs.a \ + $(liblist) wxcopy_LDADD = @XLFLAGS@ @XLIBS@ wxpaste_LDADD = @XLFLAGS@ @XLIBS@ -getstyle_LDADD = $(top_builddir)/WINGs/libWUtil.la $(liblist) +getstyle_LDADD = \ + $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wutil-rs/target/debug/libwutil_rs.a \ + $(liblist) getstyle_SOURCES = getstyle.c fontconv.c common.h setstyle_LDADD = \ $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wutil-rs/target/debug/libwutil_rs.a \ @XLFLAGS@ @XLIBS@ $(liblist) setstyle_SOURCES = setstyle.c fontconv.c common.h -convertfonts_LDADD = $(top_builddir)/WINGs/libWUtil.la $(liblist) +convertfonts_LDADD = \ + $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wutil-rs/target/debug/libwutil_rs.a \ + $(liblist) convertfonts_SOURCES = convertfonts.c fontconv.c common.h -seticons_LDADD= $(top_builddir)/WINGs/libWUtil.la $(liblist) +seticons_LDADD= \ + $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wutil-rs/target/debug/libwutil_rs.a \ + $(liblist) -geticonset_LDADD= $(top_builddir)/WINGs/libWUtil.la $(liblist) +geticonset_LDADD= \ + $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wutil-rs/target/debug/libwutil_rs.a \ + $(liblist) wmagnify_LDADD = \ $(top_builddir)/WINGs/libWINGs.la \ @@ -52,18 +71,21 @@ wmagnify_LDADD = \ wmsetbg_LDADD = \ $(top_builddir)/WINGs/libWINGs.la \ + $(top_builddir)/wutil-rs/target/debug/libwutil_rs.a \ $(top_builddir)/WINGs/libWUtil.la \ $(top_builddir)/wrlib/libwraster.la \ @XLFLAGS@ @LIBXINERAMA@ @XLIBS@ @INTLIBS@ wmgenmenu_LDADD = \ $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wutil-rs/target/debug/libwutil_rs.a \ @INTLIBS@ wmgenmenu_SOURCES = wmgenmenu.c wmgenmenu.h wmmenugen_LDADD = \ $(top_builddir)/WINGs/libWUtil.la \ + $(top_builddir)/wutil-rs/target/debug/libwutil_rs.a \ @INTLIBS@ wmmenugen_SOURCES = wmmenugen.c wmmenugen.h wmmenugen_misc.c \ @@ -75,6 +97,7 @@ wmiv_CFLAGS = @PANGO_CFLAGS@ @PTHREAD_CFLAGS@ wmiv_LDADD = \ $(top_builddir)/wrlib/libwraster.la \ $(top_builddir)/WINGs/libWINGs.la \ + $(top_builddir)/wutil-rs/target/debug/libwutil_rs.a \ @XLFLAGS@ @XLIBS@ @GFXLIBS@ \ @PANGO_LIBS@ @PTHREAD_LIBS@ @LIBEXIF@ diff --git a/wutil-rs/Makefile.am b/wutil-rs/Makefile.am index 2a8e3e00..8974f2d8 100644 --- a/wutil-rs/Makefile.am +++ b/wutil-rs/Makefile.am @@ -1,6 +1,7 @@ AUTOMAKE_OPTIONS = RUST_SOURCES = \ + src/array.rs \ src/find_file.rs \ src/lib.rs \ src/memory.rs diff --git a/wutil-rs/src/lib.rs b/wutil-rs/src/lib.rs index 83e49d77..970d30a5 100644 --- a/wutil-rs/src/lib.rs +++ b/wutil-rs/src/lib.rs @@ -1,2 +1,3 @@ +pub mod array; pub mod find_file; pub mod memory;