Index: ossp-pkg/xds/destroy.c RCS File: /v/ossp/cvs/ossp-pkg/xds/Attic/destroy.c,v rcsdiff -q -kk '-r1.4' '-r1.5' -u '/v/ossp/cvs/ossp-pkg/xds/Attic/destroy.c,v' 2>/dev/null --- destroy.c 2001/07/08 14:21:08 1.4 +++ destroy.c 2001/07/08 15:22:00 1.5 @@ -39,6 +39,9 @@ /* Free allocated memory. */ - free(xds->engines); + assert(xds->engines != NULL || xds->engines_capacity == 0); + if (xds->engines != NULL) + free(xds->engines); + free(xds); } Index: ossp-pkg/xds/find-engine.c RCS File: /v/ossp/cvs/ossp-pkg/xds/Attic/find-engine.c,v rcsdiff -q -kk '-r1.1' '-r1.2' -u '/v/ossp/cvs/ossp-pkg/xds/Attic/find-engine.c,v' 2>/dev/null --- find-engine.c 2001/07/08 14:10:32 1.1 +++ find-engine.c 2001/07/08 15:22:00 1.2 @@ -35,11 +35,9 @@ /* Sanity checks. */ - assert(engines != NULL); + assert(engines != NULL || last == 0); assert(name != NULL); assert(pos != NULL); - if (engines == NULL || name == NULL || pos == NULL) - return XDS_ERR_INVALID_ARG; /* Use binary search to find "name" in "engines". */ Index: ossp-pkg/xds/init.c RCS File: /v/ossp/cvs/ossp-pkg/xds/Attic/init.c,v rcsdiff -q -kk '-r1.3' '-r1.4' -u '/v/ossp/cvs/ossp-pkg/xds/Attic/init.c,v' 2>/dev/null --- init.c 2001/07/08 14:21:08 1.3 +++ init.c 2001/07/08 15:22:00 1.4 @@ -53,16 +53,6 @@ ctx->mode = mode; - /* Allocate engines array. */ - - ctx->engines = calloc(32, sizeof(engine_map_t)); - if (ctx->engines == NULL) - { - free(ctx); - return NULL; - } - ctx->engines_capacity = 32; - /* We are initialized. */ return ctx; Index: ossp-pkg/xds/register.c RCS File: /v/ossp/cvs/ossp-pkg/xds/Attic/register.c,v rcsdiff -q -kk '-r1.1' '-r1.2' -u '/v/ossp/cvs/ossp-pkg/xds/Attic/register.c,v' 2>/dev/null --- register.c 2001/07/04 15:58:51 1.1 +++ register.c 2001/07/08 15:22:00 1.2 @@ -25,9 +25,61 @@ SUCH DAMAGE. */ +#include /* delete me */ + +#include +#include +#include #include "internal.h" int xds_register(xds_t* xds, const char* name, xds_engine_t engine, void* engine_context) { - return XDS_ERR_INVALID_ARG; + size_t pos; + + printf("*** Inserting '%s' ...\n", name); + printf("Before the insertion:\n"); + for (pos = 0; pos < xds->engines_len; ++pos) + printf("\tengines[%d] = '%s'\n", pos, xds->engines[pos].name); + + /* Sanity checks. */ + + assert(xds != NULL); + assert(name != NULL); + assert(engine != NULL); + if (xds == NULL || name == NULL || engine == NULL) + return XDS_ERR_INVALID_ARG; + + /* Copy the name argument into our own memory. */ + + name = strdup(name); + if (name == NULL) + return XDS_ERR_NO_MEM; + + /* Search engines for the entry. */ + + if (xds_find_engine(xds->engines, xds->engines_len, name, &pos)) + { /* overwrite existing entry */ + free(xds->engines[pos].name); + } + else + { /* insert new entry */ + xds_set_capacity((void**)&xds->engines, &xds->engines_capacity, xds->engines_len + 1, sizeof(engine_map_t), 1); + memmove(&xds->engines[pos+1], &xds->engines[pos], (xds->engines_len - pos) * sizeof(engine_map_t)); + ++xds->engines_len; + } + + /* Insert entry. */ + + xds->engines[pos].name = (char*)name; + xds->engines[pos].engine = engine; + xds->engines[pos].context = engine_context; + + printf("After the insertion:\n"); + for (pos = 0; pos < xds->engines_len; ++pos) + printf("\tengines[%d] = '%s'\n", pos, xds->engines[pos].name); + printf("\n"); + + /* Everything is fine. */ + + return XDS_OK; } Index: ossp-pkg/xds/regression-tests/Makefile RCS File: /v/ossp/cvs/ossp-pkg/xds/regression-tests/Attic/Makefile,v rcsdiff -q -kk '-r1.4' '-r1.5' -u '/v/ossp/cvs/ossp-pkg/xds/regression-tests/Attic/Makefile,v' 2>/dev/null --- Makefile 2001/07/08 14:05:03 1.4 +++ Makefile 2001/07/08 15:22:00 1.5 @@ -8,7 +8,7 @@ CFLAGS = LDFLAGS = -L.. -TESTS = xds-core.exe xds-find-engine.exe xds-register.exe +TESTS = xds-core.exe xds-find-engine.exe xds-register.exe xds-callback-semantics.exe .SUFFIXES: .SUFFIXES: .c .exe