--- vencode.c 2001/07/04 15:58:51 1.1
+++ vencode.c 2001/07/09 17:19:58 1.2
@@ -25,9 +25,139 @@
SUCH DAMAGE.
*/
+#include <stdio.h> /* delete me */
+
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
#include "internal.h"
-int xds_vencode(xds_t* xds, const char* fmt, va_list args)
+int xds_vencode(xds_t* xds, const char* fmt_arg, va_list args)
{
- return XDS_ERR_INVALID_ARG;
+ char* name;
+ char* p;
+ char* fmt;
+ int rc;
+
+ /* Sanity checks. */
+
+ assert(xds != NULL);
+ assert(fmt_arg != NULL);
+ assert(xds->mode == XDS_ENCODE);
+ if (xds == NULL || fmt_arg == NULL)
+ return XDS_ERR_INVALID_ARG;
+ if (xds->mode != XDS_ENCODE)
+ return XDS_ERR_INVALID_MODE;
+
+ /* Ensure we have a buffer allocated ready for use. */
+
+ if (xds->buffer == NULL)
+ { /* allocate a new buffer */
+ int rc = xds_set_capacity((void**)&xds->buffer,
+ &xds->buffer_capacity,
+ XDS_INITIAL_BUFFER_CAPACITY,
+ sizeof(char),
+ XDS_INITIAL_BUFFER_CAPACITY);
+ assert(rc == XDS_OK || rc == XDS_ERR_NO_MEM);
+ if (rc != XDS_OK)
+ return rc;
+ printf("Enlarged buffer to %d byte.\n", xds->buffer_capacity);
+ xds->buffer_len = 0;
+ xds->we_own_buffer = (1==1);
+ }
+
+ /* Ensure the buffer has free space. */
+
+ assert(xds->buffer_len <= xds->buffer_capacity);
+ if (xds->buffer_len == xds->buffer_capacity)
+ {
+ if (xds->we_own_buffer)
+ {
+ int rc = xds_set_capacity((void**)&xds->buffer,
+ &xds->buffer_capacity,
+ xds->buffer_len + 1,
+ sizeof(char),
+ XDS_INITIAL_BUFFER_CAPACITY);
+ assert(rc == XDS_OK || rc == XDS_ERR_NO_MEM);
+ if (rc != XDS_OK)
+ return rc;
+ printf("Enlarged buffer to %d byte.\n", xds->buffer_capacity);
+ }
+ else
+ return XDS_ERR_OVERFLOW;
+ }
+
+ /* Iterate through the items in the format string and execute the
+ apropriate engines. */
+
+ fmt = p = strdup(fmt_arg);
+ if (fmt == NULL)
+ return XDS_ERR_NO_MEM;
+ for(name = p; *p != '\0'; name = p)
+ {
+ while(isalnum(*p) || *p == '-' || *p == '_')
+ ++p;
+ *p++ = '\0';
+
+ if (strlen(name) > 0)
+ {
+ size_t pos;
+ if (xds_find_engine(xds->engines, xds->engines_len, name, &pos))
+ {
+ int restart_engine;
+ do
+ {
+ printf("Executing engine '%s' ...\n", name);
+ rc = (*xds->engines[pos].engine)(xds,
+ xds->engines[pos].context,
+ xds->buffer + xds->buffer_len,
+ xds->buffer_capacity - xds->buffer_len,
+ args);
+ if (rc < 0)
+ goto leave;
+ else if (rc >= xds->buffer_capacity - xds->buffer_len)
+ { /* enlarge buffer */
+ int rc2;
+
+ if (!xds->we_own_buffer)
+ {
+ rc = XDS_ERR_OVERFLOW;
+ goto leave;
+ }
+
+ rc2 = xds_set_capacity((void**)&xds->buffer,
+ &xds->buffer_capacity,
+ xds->buffer_capacity + rc,
+ sizeof(char),
+ XDS_INITIAL_BUFFER_CAPACITY);
+ assert(rc2 == XDS_OK || rc2 == XDS_ERR_NO_MEM);
+ if (rc2 != XDS_OK)
+ {
+ rc = rc2;
+ goto leave;
+ }
+ restart_engine = (1==1);
+ printf("Enlarged buffer to %d byte.\n", xds->buffer_capacity);
+ }
+ else
+ {
+ restart_engine = (1!=1);
+ xds->buffer_len += rc;
+ }
+ }
+ while (restart_engine);
+ }
+ else
+ {
+ rc = XDS_ERR_UNKNOWN_ENGINE;
+ goto leave;
+ }
+ }
+ }
+ rc = XDS_OK;
+
+ /* Clean up and leave. */
+ leave:
+ free(fmt);
+ return rc;
}
|