OSSP CVS Repository

ossp - Difference in ossp-pkg/xds/vdecode.c versions 1.1 and 1.2
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [History

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;
     }

CVSTrac 2.0.1