New Tcl calls egw_enc/egw_dec to encode/decode binary URL info.
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 7 Mar 1996 12:45:34 +0000 (12:45 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 7 Mar 1996 12:45:34 +0000 (12:45 +0000)
www/wtcl.c

index abf579d..542c67d 100644 (file)
  * USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $Log: wtcl.c,v $
- * Revision 1.11  1996/01/24 08:26:56  adam
+ * Revision 1.12  1996/03/07 12:45:34  adam
+ * New Tcl calls egw_enc/egw_dec to encode/decode binary URL info.
+ *
+ * Revision 1.11  1996/01/24  08:26:56  adam
  * All tcl commands prefixed with egw_ (except the html command).
  *
  * Revision 1.10  1995/11/08  16:14:35  adam
@@ -221,6 +224,73 @@ static int proc_wlog_invoke (ClientData clientData, Tcl_Interp *interp,
     return TCL_OK;
 }
 
+static int proc_enc (ClientData clientData, Tcl_Interp *interp,
+                     int argc, char **argv)
+{
+    int i;
+    char buf1[4];
+    char buf2[2];
+    
+    buf1[0] = '%';
+    buf2[1] = '\0';
+    for (i = 1; i<argc; i++)
+    {
+        const char *cp = argv[i];
+        while (*cp)
+        {
+            if (*cp <= ' ' || *cp >= 127 || *cp == '/' || *cp == ' ' ||
+                *cp == '&' || *cp == ':' || *cp == '%')
+            {
+                sprintf (buf1+1, "%02X", *cp);
+                Tcl_AppendResult (interp, buf1, NULL);
+            }
+            else
+            {
+                buf2[0] = *cp;
+                Tcl_AppendResult (interp, buf2, NULL);
+            }
+            cp++;
+        }
+    }
+    return TCL_OK;
+}
+
+static int proc_dec (ClientData clientData, Tcl_Interp *interp,
+                     int argc, char **argv)
+{
+    int i;
+    unsigned val;
+    char buf[2];
+    
+    buf[1] = '\0';
+    for (i = 1; i<argc; i++)
+    {
+        const char *cp = argv[i];
+        while (*cp)
+        {
+            if (*cp == '%' && cp[1] && cp[2])
+            {
+                if (cp[1] >= 'A')
+                    val = cp[1] - 'A'+10;
+                else
+                    val = cp[1] - '0';
+
+                
+                if (cp[2] >= 'A')
+                    val = val*16 + (cp[2] - 'A'+10);
+                else
+                    val = val*16 + (cp[2] - '0');
+                buf[0] = val;
+                cp += 3;
+            }
+            else
+                buf[0] = *cp++;
+            Tcl_AppendResult (interp, buf, NULL);
+        }
+    }
+    return TCL_OK;
+}
+
 
 int Tcl_AppInit (Tcl_Interp *interp)
 {
@@ -257,6 +327,8 @@ static void *do_create (WCLIENT wcl, void *args)
     Tcl_CreateCommand (p->interp, "egw_abort", proc_wabort_invoke, p, NULL);
     Tcl_CreateCommand (p->interp, "egw_flush", proc_wflush_invoke, p, NULL);
     Tcl_CreateCommand (p->interp, "egw_log", proc_wlog_invoke, p, NULL);
+    Tcl_CreateCommand (p->interp, "egw_enc", proc_enc, p, NULL);
+    Tcl_CreateCommand (p->interp, "egw_dec", proc_dec, p, NULL);
     sprintf (tmp_str, "%d", wcl->id);
     Tcl_SetVar (p->interp, "sessionId", tmp_str, TCL_GLOBAL_ONLY);
     return p;