Index: trunk/ntripclient/ntripclient.c
===================================================================
--- trunk/ntripclient/ntripclient.c	(revision 499)
+++ trunk/ntripclient/ntripclient.c	(revision 500)
@@ -1,5 +1,5 @@
 /*
   Easy example NTRIP client for POSIX.
-  $Id: ntripclient.c,v 1.31 2007/09/18 07:09:07 stoecker Exp $
+  $Id: ntripclient.c,v 1.32 2007/09/18 10:39:19 stoecker Exp $
   Copyright (C) 2003-2005 by Dirk Stoecker <soft@dstoecker.de>
     
@@ -45,6 +45,6 @@
 
 /* CVS revision and version */
-static char revisionstr[] = "$Revision: 1.31 $";
-static char datestr[]     = "$Date: 2007/09/18 07:09:07 $";
+static char revisionstr[] = "$Revision: 1.32 $";
+static char datestr[]     = "$Date: 2007/09/18 10:39:19 $";
 
 enum MODE { HTTP = 1, RTSP = 2, NTRIP1 = 3, AUTO = 4, END };
@@ -108,4 +108,27 @@
 }
 
+static const char *encodeurl(const char *req)
+{
+  char *h = "0123456789abcdef";
+  static char buf[128];
+  char *urlenc = buf;
+  char *bufend = buf + sizeof(buf);
+
+  while(*req && urlenc != bufend)
+  {
+    if(isalnum(*req) 
+    || *req == '-' || *req == '_' || *req == '.')
+      *urlenc++ = *req++;
+    else
+    {
+      *urlenc++ = '%';
+      *urlenc++ = h[*req >> 4];
+      *urlenc++ = h[*req & 0x0f];
+      *req++;
+    }
+  } 
+  return buf;
+}
+
 static const char *geturl(const char *url, struct Args *args)
 {
@@ -113,4 +136,5 @@
   static char *Buffer = buf;
   static char *Bufend = buf+sizeof(buf);
+  char *h = "0123456789abcdef";
 
   if(strncmp("ntrip:", url, 6))
@@ -122,6 +146,24 @@
     /* scan for mountpoint */
     args->data = Buffer;
-    while(*url && *url != '@' &&  *url != ';' &&*url != '/' && Buffer != Bufend)
-      *(Buffer++) = *(url++);
+    if(*url != '?')
+    {
+       while(*url && *url != '@' &&  *url != ';' && *url != '/' && Buffer != Bufend)
+         *(Buffer++) = *(url++);
+    }
+    else
+    {
+       while(*url && *url != '@' &&  *url != '/' && Buffer != Bufend) 
+       {
+          if(isalnum(*url) || *url == '-' || *url == '_' || *url == '.')
+            *Buffer++ = *url++;
+          else
+          {
+            *Buffer++ = '%';
+            *Buffer++ = h[*url >> 4];
+            *Buffer++ = h[*url & 0x0f];
+            *url++;
+          }      
+       }
+    }
     if(Buffer == args->data)
       return "Mountpoint required.";
@@ -249,5 +291,10 @@
     case 'u': args->user = optarg; break;
     case 'p': args->password = optarg; break;
-    case 'd': args->data = optarg; break;
+    case 'd':
+       if(*optarg == '?') 
+         args->data = encodeurl(optarg);
+       else 
+         args->data = optarg; 
+     break;
     case 'n': args->nmea = optarg; break;
     case 'b': args->bitrate = 1; break;
@@ -389,5 +436,4 @@
   {
     int sleeptime = 0;
-
     do
     {
@@ -435,5 +481,4 @@
         port = args.port;
       }
-
       memset(&their_addr, 0, sizeof(struct sockaddr_in));
       if((i = strtol(port, &b, 10)) && (!b || !*b))
@@ -460,6 +505,6 @@
       their_addr.sin_family = AF_INET;
       their_addr.sin_addr = *((struct in_addr *)he->h_addr);
-
-      if(args.data && args.mode == RTSP)
+      
+      if(args.data && *args.data != '%' && args.mode == RTSP)
       {
         struct sockaddr_in local;
@@ -762,5 +807,5 @@
           exit(1);
         }
-        if(args.data)
+        if(args.data && *args.data != '%')
         {
           int k = 0;
@@ -902,5 +947,5 @@
         close(sockfd);
       }
-    } while(args.data && !stop);
+    } while(args.data && *args.data != '%' && !stop);
   }
   return 0;
