ossp-pkg/xds/vdecode.c 1.1 -> 1.2
--- vdecode.c 2001/07/04 15:58:51 1.1
+++ vdecode.c 2001/07/09 19:00:44 1.2
@@ -25,9 +25,74 @@
SUCH DAMAGE.
*/
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
#include "internal.h"
-int xds_vdecode(xds_t* xds, const char* fmt, va_list args)
+int xds_vdecode(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_DECODE);
+ if (xds == NULL || fmt_arg == NULL)
+ return XDS_ERR_INVALID_ARG;
+ if (xds->mode != XDS_DECODE)
+ return XDS_ERR_INVALID_MODE;
+
+ /* Ensure we have a buffer to decode. */
+
+ if (xds->buffer == NULL || xds->buffer_capacity == 0)
+ return XDS_ERR_UNDERFLOW;
+
+ /* 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;
+ if (*p)
+ *p++ = '\0';
+ else
+ *p = '\0';
+
+ if (strlen(name) > 0)
+ {
+ size_t pos;
+ if (xds_find_engine(xds->engines, xds->engines_len, name, &pos))
+ {
+ 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
+ xds->buffer_len += rc;
+ }
+ else
+ {
+ rc = XDS_ERR_UNKNOWN_ENGINE;
+ goto leave;
+ }
+ }
+ }
+ rc = XDS_OK;
+
+ /* Clean up and leave. */
+ leave:
+ free(fmt);
+ return rc;
}
|
|