From 2d108c1f33c86b501a2540ba48eaedded8894f20 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 8 Feb 2021 19:06:55 -0500 Subject: [PATCH] Added an elastic string buffer class to libcitadel. Why do I have a feeling I'm going to regret this. --- citadel/euidindex.c | 3 +- .../modules/listdeliver/serv_listdeliver.c | 8 +- citadel/room_ops.c | 3 +- libcitadel/Makefile.in | 4 +- libcitadel/lib/array.c | 89 +++++++++++++++++++ libcitadel/lib/libcitadel.h | 15 +++- 6 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 libcitadel/lib/array.c diff --git a/citadel/euidindex.c b/citadel/euidindex.c index bfef39b4c..247a998a8 100644 --- a/citadel/euidindex.c +++ b/citadel/euidindex.c @@ -167,8 +167,7 @@ void rebuild_euid_index_for_room(struct ctdlroom *qrbuf, void *data) { "euidindex: rebuilding EUID index for <%s>", rplist->name); CtdlUserGoto(rplist->name, 0, 0, NULL, NULL, NULL, NULL); - CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, NULL, - rebuild_euid_index_for_msg, NULL); + CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, NULL, rebuild_euid_index_for_msg, NULL); } } ptr = rplist; diff --git a/citadel/modules/listdeliver/serv_listdeliver.c b/citadel/modules/listdeliver/serv_listdeliver.c index 39006a0b7..7dd34630a 100644 --- a/citadel/modules/listdeliver/serv_listdeliver.c +++ b/citadel/modules/listdeliver/serv_listdeliver.c @@ -83,7 +83,11 @@ void listdeliver_do_msg(long msgnum, void *userdata) { } } syslog(LOG_DEBUG, "\033[33m%s\033[0m", recipients); - free(recipients); + struct recptypes *valid = validate_recipients(recipients, NULL, 0); + if (valid) { + long new_msgnum = CtdlSubmitMsg(TheMessage, valid, ""); + free_recipients(valid); + } } CM_Free(TheMessage); } @@ -174,7 +178,7 @@ void listdeliver_sweep(void) { last_run = time(NULL); doing_listdeliver = 0; - //exit(0); + exit(0); } diff --git a/citadel/room_ops.c b/citadel/room_ops.c index 1e3f787fe..44573dae3 100644 --- a/citadel/room_ops.c +++ b/citadel/room_ops.c @@ -333,13 +333,14 @@ void room_sanity_check(struct ctdlroom *qrbuf) { qrbuf->QRfloor = 0; } /* Listing order of 0 is illegal except for base rooms */ - if (qrbuf->QRorder == 0) + if (qrbuf->QRorder == 0) { if ( !(qrbuf->QRflags & QR_MAILBOX) && strncasecmp(qrbuf->QRname, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN) && strncasecmp(qrbuf->QRname, CtdlGetConfigStr("c_aideroom"), ROOMNAMELEN) ) { qrbuf->QRorder = 64; } + } } diff --git a/libcitadel/Makefile.in b/libcitadel/Makefile.in index e4f4ec476..ae5d4d664 100755 --- a/libcitadel/Makefile.in +++ b/libcitadel/Makefile.in @@ -132,7 +132,8 @@ LIB_OBJS = lib/libcitadel.lo \ lib/xdgmime/xdgmimealias.lo \ lib/xdgmime/xdgmimeparent.lo \ lib/xdgmime/xdgmimecache.lo \ - lib/html_to_ascii.lo + lib/html_to_ascii.lo \ + lib/array.lo $(LIBRARY): $(LIB_OBJS) $(LINK_LIB) $(LIB_OBJS) @@ -156,6 +157,7 @@ lib/xdgmime/xdgmimealias.lo: lib/xdgmime/xdgmimealias.c lib/xdgmime/xdgmimeparent.lo: lib/xdgmime/xdgmimeparent.c lib/xdgmime/xdgmimecache.lo: lib/xdgmime/xdgmimecache.c lib/html_to_ascii.lo: lib/html_to_ascii.c +lib/tools.lo: lib/tools.c .SUFFIXES: .c .cpp .lo .o diff --git a/libcitadel/lib/array.c b/libcitadel/lib/array.c new file mode 100644 index 000000000..444a3470a --- /dev/null +++ b/libcitadel/lib/array.c @@ -0,0 +1,89 @@ +/* + * This is a quickly-hacked-together implementation of an elastic array class. It includes constructor and destructor + * methods, append and access methods, and that's about it. The memory allocation is very naive: whenever we are about + * to append beyond the size of the buffer, we double its size. + * + * Copyright (c) 2021 by Art Cancro + * + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include +#include +#include +#include "libcitadel.h" + +/* + * Constructor for elastic array + */ +Array *array_new(size_t element_size) { + Array *newarr = malloc(sizeof(Array)); + if (newarr) { + memset(newarr, 0, sizeof(Array)); + } + newarr->element_size = element_size; + return newarr; +} + + +/* + * Destructor for elastic array + */ +void array_free(Array *arr) { + free(arr->the_elements); + free(arr); +} + + +/* + * Append an element to an array (we already know the element size because it's in the data type) + */ +void array_append(Array *arr, void *new_element) { + + if (!arr) { // silently fail if they gave us a null array + return; + } + + if ( (arr->the_elements == NULL) || (arr->num_alloc == 0)) { + arr->num_alloc = 1; + arr->num_elements = 0; + arr->the_elements = malloc(arr->element_size * arr->num_alloc); + } + + ++arr->num_elements; + if (arr->num_elements > arr->num_alloc) { + arr->num_alloc = arr->num_alloc * 2; + arr->the_elements = realloc(arr->the_elements, (arr->element_size * arr->num_alloc)); + } + + memcpy((arr->the_elements + ( (arr->num_elements-1) * arr->element_size )), new_element, arr->element_size); +} + + +/* + * Return the element in an array at the specified index + */ +void *array_get_element_at(Array *arr, int index) { + return (arr->the_elements + ( index * arr->element_size )); +} + + +/* + * Return the number of elements in an array + */ +int array_len(Array *arr) { + return arr->num_elements; +} diff --git a/libcitadel/lib/libcitadel.h b/libcitadel/lib/libcitadel.h index 9d015a937..54bf8d992 100644 --- a/libcitadel/lib/libcitadel.h +++ b/libcitadel/lib/libcitadel.h @@ -26,7 +26,7 @@ #include #include -#define LIBCITADEL_VERSION_NUMBER 925 +#define LIBCITADEL_VERSION_NUMBER 926 /* * Here's a bunch of stupid magic to make the MIME parser portable. @@ -440,6 +440,19 @@ char *html_to_ascii(const char *inputmsg, int msglen, int screenwidth); void LoadEntityList(char *FileName); +typedef struct { + void *the_elements; + size_t element_size; + int num_elements; + int num_alloc; +} Array; + +Array *array_new(size_t element_size); +void array_free(Array *arr); +void array_append(Array *arr, void *new_element); +void *array_get_element_at(Array *arr, int index); +int array_len(Array *arr); + /* vCard stuff */ -- 2.30.2