Replaced extract_token() with a completely new
[citadel.git] / citadel / tools.c
index 6d62916b8cf79d159fa2fba09d814d5b13e5e9e1..f0c2776536596ff5df9b0c8d1c2ca3ccfe239a1b 100644 (file)
@@ -108,86 +108,36 @@ int num_tokens(const char *source, char tok)
  */
 long extract_token(char *dest, const char *source, int parmnum, char separator, int maxlen)
 {
-       const char *s;          /* source */
-       const char *start;
-       const char *end;
-       int count = 0;
-       int len = 0;
-       /* Locate desired parameter */
+       const char *s;                  /* source */
+       int len = 0;                    /* running total length of extracted string */
+       int current_token = 0;          /* token currently being processed */
+
        s = source;
-       while (1) {
-               /* End of string, bail! */
-               if (IsEmptyStr(s)) {
-                       *dest = '\0';
-                       return -1;              /* Parameter not found */
-               }
-               if (*s == separator) {
-                       count++;
-                       if (count == parmnum)
-                               start = s + 1; // we found da start border!
-                       else if (count == parmnum + 1)
-                       {
-                               end = s; // we found da end border!
-                               break; // so we're done.
-                       }
-               }
-               s++;
+
+       if (dest == NULL) {
+               return(-1);
        }
 
-       len = end - start;
-       if (len > maxlen){
-               /** TODO: do find an alternative for this if we're not inside of the server
-               lprintf (ERROR, 
-                        "Warning: Tokenizer failed due to space. better use grab_token here? "
-                        "(Token: %d N: %d Extractstring at: %s FullString: %s", 
-                        (char)separator, parmnum, start, source);
-               */
-               *dest = '\0';
-               return -1;              /* Parameter exceeds space */
-       }               
-       memcpy(dest, start, len);
-       dest[len]='\0';
-       return len;
-}
+       dest[0] = 0;
 
-/*
- * extract_token() - a string tokenizer
- * returns -1 if not found, or length of token.
- */
-long grab_token(char **dest, const char *source, int parmnum, char separator)
-{
-       const char *s;          /* source */
-       const char *start;
-       const char *end;
-       int count = 0;
-       int len = 0;
+       if (s == NULL) {
+               return(-1);
+       }
 
-       /* Locate desired parameter */
-       s = source;
-       while (1) {
-               /* End of string, bail! */
-               if (IsEmptyStr(s)) {
-                       *dest = '\0';
-                       return -1;              /* Parameter not found */
-               }
+       while (*s) {
                if (*s == separator) {
-                       count++;
-                       if (count == parmnum)
-                               start = s + 1; // we found da start border!
-                       else if (count == parmnum + 1)
-                       {
-                               end = s; // we found da end border!
-                               break; // so we're done.
-                       }
+                       ++current_token;
                }
-               s++;
+               else if ( (current_token == parmnum) && (len < maxlen) ) {
+                       dest[len] = *s;
+                       ++len;
+               }
+               ++s;
        }
 
-       len = end - start;
-       *dest = (char*)malloc (len + 1);
-       memcpy(*dest, start, len);
-       (*dest)[len]='\0';
-       return len;
+       dest[len] = 0;
+       if (current_token < parmnum) return(-1);
+       return(len);
 }