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;