Index: ossp-pkg/xds/regression-tests/Makefile RCS File: /v/ossp/cvs/ossp-pkg/xds/regression-tests/Attic/Makefile,v rcsdiff -q -kk '-r1.12' '-r1.13' -u '/v/ossp/cvs/ossp-pkg/xds/regression-tests/Attic/Makefile,v' 2>/dev/null --- Makefile 2001/07/18 16:59:28 1.12 +++ Makefile 2001/07/18 17:38:37 1.13 @@ -11,7 +11,7 @@ LDFLAGS = -L.. TESTS = xds-core.exe xds-find-engine.exe xds-register.exe xds-encode.exe \ - xds-getbuffer.exe xds-decode.exe xds-setbuffer.exe \ + xds-getbuffer.exe xds-decode.exe xds-setbuffer.exe xds-engine-restart.exe \ xdr-uint32.exe xdr-int32.exe xdr-uint64.exe xdr-int64.exe .SUFFIXES: Index: ossp-pkg/xds/regression-tests/xds-engine-restart.c RCS File: /v/ossp/cvs/ossp-pkg/xds/regression-tests/Attic/xds-engine-restart.c,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/xds/regression-tests/Attic/xds-engine-restart.c,v' | diff -u /dev/null - -L'ossp-pkg/xds/regression-tests/xds-engine-restart.c' 2>/dev/null --- ossp-pkg/xds/regression-tests/xds-engine-restart.c +++ - 2024-05-18 06:44:47.193435013 +0200 @@ -0,0 +1,111 @@ +/* + XDS - OSSP Extensible Data Serialization Library + Copyright (c) 2001 The OSSP Project (http://www.ossp.org/) + Copyright (c) 2001 Cable & Wireless Deutschland (http://www.cw.com/de/) + + This file is part of OSSP XDS, an extensible data serialization + library which can be found at http://www.ossp.com/pkg/xds/. + + Permission to use, copy, modify, and distribute this software for + any purpose with or without fee is hereby granted, provided that + the above copyright notice and this permission notice appear in all + copies. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include +#include +#include "../internal.h" + +static int dummy_engine(xds_t* xds, void* engine_context, void* buffer, size_t buffer_size, va_list* args) + { + if (xds == NULL) + { + printf("XDS context isn't passed through to registered engine.\n"); + exit(1); + } + if (engine_context != (void*)42) + { + printf("Engine context isn't passed through to registered engine.\n"); + exit(1); + } + if (buffer == NULL) + { + printf("Buffer passed to engine is NULL.\n"); + exit(1); + } + if (buffer_size == 0) + { + printf("Buffer size passed to engine is zero!\n"); + exit(1); + } + if (args == NULL) + { + printf("args pointer passed to engine is NULL!\n"); + exit(1); + } + if (va_arg(*args, int) != 42) + { + printf("The varadic argument is not what the engine expected!\n"); + exit(1); + } + return 64; + } + +int main() + { + xds_t* xds; + char* buffer; + size_t buffer_size; + + /* Create an XDS context and set a buffer that's too small for the + first encode() call. Then call encode() with two parameters: + the one the engine is expecting and a different one after that. + The engine will complain if it sees the second value -- what + would mean that the args parameter was not resetted to the + original value before the engine is restarted after buffer + enlargement. */ + + xds = xds_init(XDS_ENCODE); + if (xds == NULL) + { + printf("Failed to initialize XDS context.\n"); + return 1; + } + if (xds_register(xds, "int", &dummy_engine, (void*)42) != XDS_OK) + { + printf("Failed to register my encoding engines.\n"); + return 1; + } + buffer = malloc(32); + if (buffer == NULL) + { + printf("malloc() failed!\n"); + return 1; + } + buffer_size = 32; + if (xds_setbuffer(xds, XDS_GIFT, buffer, buffer_size) != XDS_OK) + { + printf("xds_setbuffer() failed!\n"); + return 1; + } + if (xds_encode(xds, "int", 42, 13) != XDS_OK) + { + printf("xds_encode() failed!"); + return 1; + } + xds_destroy(xds); + return 0; + } Index: ossp-pkg/xds/vencode.c RCS File: /v/ossp/cvs/ossp-pkg/xds/Attic/vencode.c,v rcsdiff -q -kk '-r1.7' '-r1.8' -u '/v/ossp/cvs/ossp-pkg/xds/Attic/vencode.c,v' 2>/dev/null --- vencode.c 2001/07/16 18:31:36 1.7 +++ vencode.c 2001/07/18 17:38:37 1.8 @@ -34,6 +34,7 @@ int xds_vencode(xds_t* xds, const char* fmt_arg, va_list args) { + va_list args_backup; char* name; char* p; char* fmt; @@ -111,6 +112,7 @@ do { printf("Executing engine '%s' ...\n", name); + args_backup = args; rc = (*xds->engines[pos].engine)(xds, xds->engines[pos].context, xds->buffer + xds->buffer_len, @@ -123,7 +125,10 @@ int rc2; if (rc > xds->buffer_capacity - xds->buffer_len) + { restart_engine = (1==1); + args = args_backup; + } else restart_engine = (1!=1);